-- $Id: java_api.ty,v 1.7 99/08/10 14:49:13 hnilsson Exp $ -- /***************************************************************************/ -- /* Copyright (C) 1997-1999 INRIA Sophia-Antipolis */ -- /* I. Attali, D. Caromel and M. Russo */ -- /* Projet OASIS */ -- /* Rt. des Lucioles, BP 93, */ -- /* F-06902 Sophia Antipolis cedex */ -- /* (+33) 4 92 38 76 31 */ -- /* All rights reserved */ -- /***************************************************************************/ -- -- /***************************************************************************/ -- /* Rules for the Java language APIs */ -- /***************************************************************************/ program java_api is use java; use PSP; import getDirectAncestor ( |- OptTypeName -> OptTypeName ) from java_inheritance; import ObjectAPI ( Objects, ClassVariablesL, Ref, Ref |- Identifier, java -> Objects, ClassVariablesL, Insts, ThreadStatus ) from java_object_api; import getObjectType ( ObjectId |- Objects -> Identifier ) from java_object_list; import ThreadAPI ( Objects, ClassVariablesL, Ref, Ref |- Identifier, java -> Objects, ClassVariablesL, Insts, ThreadStatus ) from java_thread_api; import ThrowableAPI ( Objects, ClassVariablesL, Ref, Ref |- Identifier, java -> Objects, ClassVariablesL, Insts, ThreadStatus ) from java_throwable_api; set APIMethodOrConstructorCall is --SC: Performs an API method or constructor call. -- --JC: Object list, Class variable list, --JC: Current executing thread reference, Current object reference --JC: |- Method or Constructor name, Arguments value list (maybe empty) --JC: -> modified object list, modified class variable list, --JC: Continuation instruction list (maybe empty), New current thread status judgement Objects, ClassVariablesL, Ref, Ref |- Identifier, java -> Objects, ClassVariablesL, Insts, ThreadStatus; MethodOrConstructorCallTreatment: --RC: Gets the object type and dispatches the method --RC: or constructor call to the right class. getObjectType( ObjId |- ObjL1 -> ClName ) & APIDispatch( ObjL1, ClVarL1, OThId, ObjId |- ClName, MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ) -------------------------------- ObjL1, ClVarL1, OThId, ObjId |- MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ; end APIMethodOrConstructorCall; set APIDispatch is --SC: Dispatches the API according to the type of the object that has --SC: called this API. If the API does not belong to the given --SC: object type, tries with the direct ancestor of the object --SC: class. Goes up in the hierarchy until the API can be --SC: performed (ie the right class has been found) or until the --SC: hierarchy root (ie Object class). In this latter case, that --SC: means that the given method or constructor is not an API. -- --JC: Object list, Class variable list, --JC: Current executing thread reference, Current object reference --JC: |- Class name, Method or Constructor name, Argument list (maybe empty) --JC: -> Modified object list, Modified class variable list, --JC: Continuation instruction list (maybe empty), New current thread status judgement Objects, ClassVariablesL, Ref, Ref |- Identifier, Identifier, java -> Objects, ClassVariablesL, Insts, ThreadStatus; ObjectAPI: ObjectAPI( ObjL1, ClVarL1, OThId, ObjId |- MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ) -------------------------------- ObjL1, ClVarL1, OThId, ObjId |- identifier "Object", MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ; ThrowableAPI: ThrowableAPI( ObjL1, ClVarL1, OThId, ObjId |- MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ) -------------------------------- ObjL1, ClVarL1, OThId, ObjId |- identifier "Throwable", MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ; ThreadAPI: ThreadAPI( ObjL1, ClVarL1, OThId, ObjId |- MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ) -------------------------------- ObjL1, ClVarL1, OThId, ObjId |- identifier "Thread", MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ; InheritedMethodLookingForTheDirectAPIAncestor: --RC: The given method does not belong to the current class --RC: 'ClName1'. So we try to perform the given API on --RC: the direct ancestor 'ClName2' of the given class getDirectAncestor( |- ClName1 -> ClName2 ) & ObjL1, ClVarL1, OThId, ObjId |- ClName2, MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus -------------------------------- ObjL1, ClVarL1, OThId, ObjId |- ClName1, MethName, ArgL -> ObjL1_1, ClVarL1_1, InstL, ThStatus ; end APIDispatch; set getAPIObjectAttributes is --SC: Gives the attribute names and default values that belong to a --SC: new object for the given class. -- --JC: |- Class name of the new object --JC: -> attribute List (name/default value) judgement |- Identifier -> Pairs; Object: |- identifier "Object" -> pairs[] ; Thread: |- identifier "Thread" -> pairs[] ; NullPointerException: |- identifier "NullPointerException" -> pairs[] ; IllegalThreadStateException: |- identifier "IllegalThreadStateException" -> pairs[] ; IllegalMonitorStateException: |- identifier "IllegalMonitorStateException" -> pairs[] ; RuntimeException: |- identifier "RuntimeException" -> pairs[] ; Throwable: |- identifier "Throwable" -> pairs[] ; Exception: |- identifier "Exception" -> pairs[] ; ArithmeticException: |- identifier "ArithmeticException" -> pairs[] ; NegativeArraySizeException: |- identifier "NegativeArraySizeException" -> pairs[] ; IndexOutOfBoundsException: |- identifier "IndexOutOfBoundsException" -> pairs[] ; ArrayStoreException: |- identifier "ArrayStoreException" -> pairs[] ; end getAPIObjectAttributes; set getClassAPIDirectAncestor is --SC: Gets the direct API ancestor of the given class. -- --JC: |- Class name --JC: -> Direct ancestor class name judgement |- OptTypeName -> OptTypeName; Thread_Object: |- identifier "Thread" -> identifier "Object" ; Throwable_Object: |- identifier "Throwable" -> identifier "Object" ; Error_Throwable: |- identifier "Error" -> identifier "Throwable" ; LinkageError_Error: |- identifier "LinkageError" -> identifier "Error" ; VirtualMachineError_Error: |- identifier "VirtualMachineError" -> identifier "Error" ; Exception_Throwable: |- identifier "Exception" -> identifier "Throwable" ; ClassNotFoundException_Exception: |- identifier "ClassNotFoundException" -> identifier "Exception" ; CloneNotSupportedException_Exception: |- identifier "CloneNotSupportedException" -> identifier "Exception" ; IllegalAccessException_Exception: |- identifier "IllegalAccessException" -> identifier "Exception" ; InstantiationException_Exception: |- identifier "InstantiationException" -> identifier "Exception" ; InterruptedException_Exception: |- identifier "InterruptedException" -> identifier "Exception" ; RuntimeException_Exception: |- identifier "RuntimeException" -> identifier "Exception" ; ArithmeticException_RuntimeException: |- identifier "ArithmeticException" -> identifier "RuntimeException" ; ArrayStoreException_RuntimeException: |- identifier "ArrayStoreException" -> identifier "RuntimeException" ; ClassCastException_RuntimeException: |- identifier "ClassCastException" -> identifier "RuntimeException" ; IllegalArgumentException_RuntimeException: |- identifier "IllegalArgumentException" -> identifier "RuntimeException" ; IllegalThreadStateException_IllegalArgumentException: |- identifier "IllegalThreadStateException" -> identifier "IllegalArgumentException" ; NumberFormatException_IllegalArgumentException: |- identifier "NumberFormatException" -> identifier "IllegalArgumentException" ; IllegalMonitorStateException_RuntimeException: |- identifier "IllegalMonitorStateException" -> identifier "RuntimeException" ; IndexOutOfBoundsException_RuntimeException: |- identifier "IndexOutOfBoundsException" -> identifier "RuntimeException" ; NegativeArraySizeException_RuntimeException: |- identifier "NegativeArraySizeException" -> identifier "RuntimeException" ; NullPointerException_RuntimeException: |- identifier "NullPointerException" -> identifier "RuntimeException" ; SecurityException_RuntimeException: |- identifier "SecurityException" -> identifier "RuntimeException" ; end getClassAPIDirectAncestor; end java_api