note description: "[ Access to internal object properties. This class may be used as ancestor by classes needing its facilities. ]" library: "Free implementation of ELKS library" legal: "See notice at end of class." status: "See notice at end of class." date: "$Date: 2019-12-09 13:48:44 +0000 (Mon, 09 Dec 2019) $" revision: "$Revision: 103722 $" class INTERNAL create default_create feature -- Initialization default_create -- Process instances of classes with no creation clause. -- (Default: do nothing.) -- (from ANY) do end feature -- Access attached_type (type_id: INTEGER_32): INTEGER_32 -- Attached version of type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.attached_type (type_id) ensure -- from REFLECTOR instance_free: class unchanged_if_attached: is_attached_type (type_id) implies type_id = Result end Bit_type: INTEGER_32 = 8 -- This type is obsolete and is not used anymore. -- (from REFLECTOR_CONSTANTS) boolean_field (i: INTEGER_32; object: ANY): BOOLEAN -- Boolean value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) boolean_field: field_type (i, object) = Boolean_type do Reflected_object.set_object (object) Result := Reflected_object.boolean_field (i) ensure instance_free: class end Boolean_type: INTEGER_32 = 3 -- Abstract type ID for predefined type BOOLEAN. -- (from REFLECTOR_CONSTANTS) character_32_field (i: INTEGER_32; object: ANY): CHARACTER_32 -- Character value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) character_32_field: field_type (i, object) = Character_32_type do Reflected_object.set_object (object) Result := Reflected_object.character_32_field (i) ensure instance_free: class end Character_32_type: INTEGER_32 = 12 -- Abstract type ID for predefined type CHARACTER_32. -- Was declared in REFLECTOR_CONSTANTS as synonym of Wide_character_type. -- (from REFLECTOR_CONSTANTS) character_8_field (i: INTEGER_32; object: ANY): CHARACTER_8 -- Character value of i-th field of object -- Was declared in INTERNAL as synonym of character_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) character_8_field: field_type (i, object) = Character_8_type do Reflected_object.set_object (object) Result := Reflected_object.character_8_field (i) ensure instance_free: class end Character_8_type: INTEGER_32 = 2 -- Abstract type ID for predefined type CHARACTER_8. -- Was declared in REFLECTOR_CONSTANTS as synonym of Character_type. -- (from REFLECTOR_CONSTANTS) character_field (i: INTEGER_32; object: ANY): CHARACTER_8 -- Character value of i-th field of object -- Was declared in INTERNAL as synonym of character_8_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) character_8_field: field_type (i, object) = Character_8_type do Reflected_object.set_object (object) Result := Reflected_object.character_8_field (i) ensure instance_free: class end Character_type: INTEGER_32 = 2 -- Abstract type ID for predefined type CHARACTER_8. -- Was declared in REFLECTOR_CONSTANTS as synonym of Character_8_type. -- (from REFLECTOR_CONSTANTS) class_name (object: ANY): STRING_8 -- Name of the class associated with object require object_not_void: object /= Void do Result := object.generator ensure instance_free: class end class_name_8_of_type (type_id: INTEGER_32): STRING_8 -- Name of class associated with dynamic type type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.generator_8_of_type (type_id) ensure -- from REFLECTOR instance_free: class end class_name_of_type (type_id: INTEGER_32): STRING_8 -- Name of class associated with dynamic type type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.generator_of_type (type_id) ensure -- from REFLECTOR instance_free: class end detachable_type (type_id: INTEGER_32): INTEGER_32 -- Detachable version of type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.detachable_type (type_id) ensure -- from REFLECTOR instance_free: class unchanged_if_detachable: not is_attached_type (type_id) implies type_id = Result end double_field (i: INTEGER_32; object: ANY): REAL_64 -- Double precision value of i-th field of object -- Was declared in INTERNAL as synonym of real_64_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) real_64_field: field_type (i, object) = Real_64_type do Reflected_object.set_object (object) Result := Reflected_object.real_64_field (i) ensure instance_free: class end Double_type: INTEGER_32 = 6 -- Abstract type ID for predefined type REAL_64. -- Was declared in REFLECTOR_CONSTANTS as synonym of Real_64_type. -- (from REFLECTOR_CONSTANTS) dynamic_type (object: separate ANY): INTEGER_32 -- Dynamic type of object require object_not_void: object /= Void do Reflected_object.set_object (object) Result := Reflected_object.dynamic_type ensure instance_free: class dynamic_type_nonnegative: Result >= 0 end expanded_field_type (i: INTEGER_32; object: ANY): STRING_8 obsolete "Use `class_name_of_type (field_static_type_of_type (i, dynamic_type (object)))' instead. [2017-05-31]" -- Class name associated with the i-th -- expanded field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) is_expanded: field_type (i, object) = Expanded_type do Result := class_name_of_type (field_static_type_of_type (i, dynamic_type (object))) ensure instance_free: class result_exists: Result /= Void end Expanded_type: INTEGER_32 = 7 -- Abstract type ID for a non-predefined expanded type. -- (from REFLECTOR_CONSTANTS) field (i: INTEGER_32; object: ANY): detachable ANY -- Object attached to the i-th field of object -- (directly or through a reference) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) not_special: not is_special (object) do Reflected_object.set_object (object) Result := Reflected_object.field (i) ensure instance_free: class end field_name (i: INTEGER_32; object: ANY): STRING_8 -- Name of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) not_special: not is_special (object) do Result := field_name_of_type (i, dynamic_type (object)) ensure instance_free: class result_exists: Result /= Void end field_name_8_of_type (i: INTEGER_32; type_id: INTEGER_32): STRING_8 -- Name of i-th field of dynamic type type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 index_large_enough: i >= 1 index_small_enought: i <= field_count_of_type (type_id) do create Result.make_from_c ({ISE_RUNTIME}.field_name_of_type (i, type_id)) ensure -- from REFLECTOR instance_free: class end field_name_of_type (i: INTEGER_32; type_id: INTEGER_32): STRING_8 -- Name of i-th field of dynamic type type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 index_large_enough: i >= 1 index_small_enought: i <= field_count_of_type (type_id) do create Result.make_from_c ({ISE_RUNTIME}.field_name_of_type (i, type_id)) ensure -- from REFLECTOR instance_free: class end field_offset (i: INTEGER_32; object: ANY): INTEGER_32 -- Offset of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) not_special: not is_special (object) do Reflected_object.set_object (object) Result := Reflected_object.field_offset (i) ensure instance_free: class end field_static_type_of_type (i: INTEGER_32; type_id: INTEGER_32): INTEGER_32 -- Static type of declared i-th field of dynamic type type_id -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 index_large_enough: i >= 1 index_small_enough: i <= field_count_of_type (type_id) do Result := {ISE_RUNTIME}.field_static_type_of_type (i, type_id) ensure -- from REFLECTOR instance_free: class field_type_nonnegative: Result >= 0 end field_type (i: INTEGER_32; object: ANY): INTEGER_32 -- Abstract type of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) do Result := field_type_of_type (i, dynamic_type (object)) ensure instance_free: class field_type_nonnegative: Result >= 0 end field_type_of_type (i: INTEGER_32; type_id: INTEGER_32): INTEGER_32 -- Abstract type of i-th field of dynamic type type_id -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 index_large_enough: i >= 1 index_small_enough: i <= field_count_of_type (type_id) do Result := {ISE_RUNTIME}.field_type_of_type (i, type_id) ensure -- from REFLECTOR instance_free: class field_type_nonnegative: Result >= 0 end generating_type: TYPE [detachable INTERNAL] -- Type of current object -- (type of which it is a direct instance) -- (from ANY) external "built_in" ensure -- from ANY generating_type_not_void: Result /= Void end generator: STRING_8 -- Name of current object's generating class -- (base class of the type of which it is a direct instance) -- (from ANY) external "built_in" ensure -- from ANY generator_not_void: Result /= Void generator_not_empty: not Result.is_empty end generic_count (obj: ANY): INTEGER_32 -- Number of generic parameter in obj. require obj_not_void: obj /= Void do Reflected_object.set_object (obj) Result := Reflected_object.generic_count ensure instance_free: class end generic_count_of_type (type_id: INTEGER_32): INTEGER_32 -- Number of generic parameter in type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.generic_parameter_count (type_id) ensure -- from REFLECTOR instance_free: class end generic_dynamic_type (obj: ANY; i: INTEGER_32): INTEGER_32 -- Dynamic type of generic parameter of object at -- position i. require obj_not_void: obj /= Void obj_generic: generic_count (obj) > 0 i_valid: i > 0 and i <= generic_count (obj) do Reflected_object.set_object (obj) Result := Reflected_object.generic_dynamic_type (i) ensure instance_free: class dynamic_type_nonnegative: Result >= 0 end generic_dynamic_type_of_type (type_id: INTEGER_32; i: INTEGER_32): INTEGER_32 -- Dynamic type of generic parameter of type_id at position i. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 type_id_generic: generic_count_of_type (type_id) > 0 i_valid: i > 0 and i <= generic_count_of_type (type_id) do Result := {ISE_RUNTIME}.eif_gen_param_id (type_id, i) ensure -- from REFLECTOR instance_free: class dynamic_type_nonnegative: Result >= 0 end integer_16_field (i: INTEGER_32; object: ANY): INTEGER_16 -- Integer value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_16_field: field_type (i, object) = Integer_16_type do Reflected_object.set_object (object) Result := Reflected_object.integer_16_field (i) ensure instance_free: class end Integer_16_type: INTEGER_32 = 10 -- Abstract type ID for predefined type INTEGER_16. -- (from REFLECTOR_CONSTANTS) integer_32_field (i: INTEGER_32; object: ANY): INTEGER_32 -- Integer value of i-th field of object -- Was declared in INTERNAL as synonym of integer_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_32_field: field_type (i, object) = Integer_32_type do Reflected_object.set_object (object) Result := Reflected_object.integer_32_field (i) ensure instance_free: class end Integer_32_type: INTEGER_32 = 4 -- Abstract type ID for predefined type INTEGER_32. -- Was declared in REFLECTOR_CONSTANTS as synonym of Integer_type. -- (from REFLECTOR_CONSTANTS) integer_64_field (i: INTEGER_32; object: ANY): INTEGER_64 -- Integer value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_64_field: field_type (i, object) = Integer_64_type do Reflected_object.set_object (object) Result := Reflected_object.integer_64_field (i) ensure instance_free: class end Integer_64_type: INTEGER_32 = 11 -- Abstract type ID for predefined type INTEGER_64. -- (from REFLECTOR_CONSTANTS) integer_8_field (i: INTEGER_32; object: ANY): INTEGER_8 -- Integer value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_8_field: field_type (i, object) = Integer_8_type do Reflected_object.set_object (object) Result := Reflected_object.integer_8_field (i) ensure instance_free: class end Integer_8_type: INTEGER_32 = 9 -- Abstract type ID for predefined type INTEGER_8. -- (from REFLECTOR_CONSTANTS) integer_field (i: INTEGER_32; object: ANY): INTEGER_32 -- Integer value of i-th field of object -- Was declared in INTERNAL as synonym of integer_32_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_32_field: field_type (i, object) = Integer_32_type do Reflected_object.set_object (object) Result := Reflected_object.integer_32_field (i) ensure instance_free: class end Integer_type: INTEGER_32 = 4 -- Abstract type ID for predefined type INTEGER_32. -- Was declared in REFLECTOR_CONSTANTS as synonym of Integer_32_type. -- (from REFLECTOR_CONSTANTS) Max_predefined_type: INTEGER_32 = 16 -- (from REFLECTOR_CONSTANTS) Min_predefined_type: INTEGER_32 = -2 -- (from REFLECTOR_CONSTANTS) natural_16_field (i: INTEGER_32; object: ANY): NATURAL_16 -- NATURAL_16 value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) natural_16_field: field_type (i, object) = Natural_16_type do Reflected_object.set_object (object) Result := Reflected_object.natural_16_field (i) ensure instance_free: class end Natural_16_type: INTEGER_32 = 14 -- Abstract type ID for predefined type NATURAL_16. -- (from REFLECTOR_CONSTANTS) natural_32_field (i: INTEGER_32; object: ANY): NATURAL_32 -- NATURAL_32 value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) natural_field: field_type (i, object) = Natural_32_type do Reflected_object.set_object (object) Result := Reflected_object.natural_32_field (i) ensure instance_free: class end Natural_32_type: INTEGER_32 = 15 -- Abstract type ID for predefined type NATURAL_32. -- (from REFLECTOR_CONSTANTS) natural_64_field (i: INTEGER_32; object: ANY): NATURAL_64 -- NATURAL_64 value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) natural_64_field: field_type (i, object) = Natural_64_type do Reflected_object.set_object (object) Result := Reflected_object.natural_64_field (i) ensure instance_free: class end Natural_64_type: INTEGER_32 = 16 -- Abstract type ID for predefined type NATURAL_64. -- (from REFLECTOR_CONSTANTS) natural_8_field (i: INTEGER_32; object: ANY): NATURAL_8 -- NATURAL_8 value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) natural_8_field: field_type (i, object) = Natural_8_type do Reflected_object.set_object (object) Result := Reflected_object.natural_8_field (i) ensure instance_free: class end Natural_8_type: INTEGER_32 = 13 -- Abstract type ID for predefined type NATURAL_8. -- (from REFLECTOR_CONSTANTS) None_type: INTEGER_32 = -2 -- Type ID representation for NONE. -- (from REFLECTOR_CONSTANTS) pointer_field (i: INTEGER_32; object: ANY): POINTER -- Pointer value of i-th field of object require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) pointer_field: field_type (i, object) = Pointer_type do Reflected_object.set_object (object) Result := Reflected_object.pointer_field (i) ensure instance_free: class end Pointer_type: INTEGER_32 = 0 -- Abstract type ID for predefined type POINTER. -- (from REFLECTOR_CONSTANTS) real_32_field (i: INTEGER_32; object: ANY): REAL_32 -- Real value of i-th field of object -- Was declared in INTERNAL as synonym of real_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) real_32_field: field_type (i, object) = Real_32_type do Reflected_object.set_object (object) Result := Reflected_object.real_32_field (i) ensure instance_free: class end Real_32_type: INTEGER_32 = 5 -- Abstract type ID for predefined type REAL_32. -- Was declared in REFLECTOR_CONSTANTS as synonym of Real_type. -- (from REFLECTOR_CONSTANTS) real_64_field (i: INTEGER_32; object: ANY): REAL_64 -- Double precision value of i-th field of object -- Was declared in INTERNAL as synonym of double_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) real_64_field: field_type (i, object) = Real_64_type do Reflected_object.set_object (object) Result := Reflected_object.real_64_field (i) ensure instance_free: class end Real_64_type: INTEGER_32 = 6 -- Abstract type ID for predefined type REAL_64. -- Was declared in REFLECTOR_CONSTANTS as synonym of Double_type. -- (from REFLECTOR_CONSTANTS) real_field (i: INTEGER_32; object: ANY): REAL_32 -- Real value of i-th field of object -- Was declared in INTERNAL as synonym of real_32_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) real_32_field: field_type (i, object) = Real_32_type do Reflected_object.set_object (object) Result := Reflected_object.real_32_field (i) ensure instance_free: class end Real_type: INTEGER_32 = 5 -- Abstract type ID for predefined type REAL_32. -- Was declared in REFLECTOR_CONSTANTS as synonym of Real_32_type. -- (from REFLECTOR_CONSTANTS) reference_field (i: INTEGER_32; object: ANY): detachable ANY -- Reference value of the i-th field of object. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) not_special: not is_special (object) valid_type: field_type (i, object) = Reference_type do Reflected_object.set_object (object) Result := Reflected_object.reference_field (i) ensure instance_free: class end Reference_type: INTEGER_32 = 1 -- Abstract type ID for a reference type. -- (from REFLECTOR_CONSTANTS) storable_version_of_type (a_type_id: INTEGER_32): detachable IMMUTABLE_STRING_8 -- Storable version if any specified. -- (from REFLECTOR) require -- from REFLECTOR a_type_id_nonnegative: a_type_id >= 0 local l_result: detachable STRING_8 do Id_to_storable_version.search (a_type_id) if Id_to_storable_version.found then Result := Id_to_storable_version.found_item else l_result := {ISE_RUNTIME}.storable_version_of_type (a_type_id) if l_result /= Void then create Result.make_from_string (l_result) end; Id_to_storable_version.put (Result, a_type_id) end ensure -- from REFLECTOR instance_free: class end type_name (object: ANY): STRING_8 obsolete "Use `type_name_32` instead. [2020-05-31]" -- Name of object's generating type -- (type of which object is a direct instance). require object_not_void: object /= Void do Result := {UTF_CONVERTER}.string_32_to_utf_8_string_8 (type_name_32 (object)) ensure instance_free: class end type_name_32 (object: ANY): READABLE_STRING_32 -- Name of object's generating type -- (type of which object is a direct instance). require object_not_void: object /= Void do Result := object.generating_type.name_32 ensure instance_free: class end type_name_8_of_type (type_id: INTEGER_32): STRING_8 -- Name of type_id's generating type (type of which type_id -- is a direct instance). -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.generating_type_8_of_type (type_id) ensure -- from REFLECTOR instance_free: class end type_name_of_type (type_id: INTEGER_32): STRING_8 -- Name of type_id's generating type (type of which type_id -- is a direct instance). -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.generating_type_of_type (type_id) ensure -- from REFLECTOR instance_free: class end Wide_character_type: INTEGER_32 = 12 -- Abstract type ID for predefined type CHARACTER_32. -- Was declared in REFLECTOR_CONSTANTS as synonym of Character_32_type. -- (from REFLECTOR_CONSTANTS) feature -- Measurement deep_physical_size (object: ANY): INTEGER_32 -- Space occupied by object and its children in bytes require object_not_void: object /= Void local l_size: NATURAL_64 do l_size := deep_physical_size_64 (object) Result := l_size.min ({INTEGER_32}.max_value.as_natural_64).as_integer_32 ensure instance_free: class end deep_physical_size_64 (object: ANY): NATURAL_64 -- Space occupied by object and its children in bytes require object_not_void: object /= Void local l_traverse: OBJECT_GRAPH_BREADTH_FIRST_TRAVERSABLE do create l_traverse; l_traverse.set_root_object (object); l_traverse.set_is_skip_transient (False); l_traverse.traverse if attached l_traverse.visited_objects as l_objects then from l_objects.start until l_objects.after loop Result := Result + physical_size_64 (l_objects.item); l_objects.forth end end ensure instance_free: class end field_count (object: ANY): INTEGER_32 -- Number of logical fields in object require object_not_void: object /= Void do Reflected_object.set_object (object) Result := Reflected_object.field_count ensure instance_free: class end field_count_of_type (type_id: INTEGER_32): INTEGER_32 -- Number of logical fields in dynamic type type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.field_count_of_type (type_id) ensure -- from REFLECTOR instance_free: class end persistent_field_count (object: ANY): INTEGER_32 -- Number of logical fields in object that are not transient. require object_not_void: object /= Void do Result := persistent_field_count_of_type (dynamic_type (object)) ensure instance_free: class count_positive: Result >= 0 end persistent_field_count_of_type (a_type_id: INTEGER_32): INTEGER_32 -- Number of logical fields in dynamic type type_id that are not transient. -- (from REFLECTOR) require -- from REFLECTOR a_type_non_negative: a_type_id >= 0 do Result := {ISE_RUNTIME}.persistent_field_count_of_type (a_type_id) ensure -- from REFLECTOR instance_free: class end physical_size (object: ANY): INTEGER_32 -- Space occupied by object in bytes require object_not_void: object /= Void local l_size: NATURAL_64 do l_size := {ISE_RUNTIME}.object_size ($object.to_pointer) Result := l_size.min ({INTEGER_32}.max_value.as_natural_64).as_integer_32 ensure instance_free: class end physical_size_64 (object: separate ANY): NATURAL_64 -- Space occupied by object in bytes require object_not_void: object /= Void do Result := {ISE_RUNTIME}.object_size ($object.to_pointer) ensure instance_free: class end feature -- Comparison frozen deep_equal (a: detachable ANY; b: like arg #1): BOOLEAN -- Are a and b either both void -- or attached to isomorphic object structures? -- (from ANY) do if a = Void then Result := b = Void else Result := b /= Void and then a.is_deep_equal (b) end ensure -- from ANY instance_free: class shallow_implies_deep: standard_equal (a, b) implies Result both_or_none_void: (a = Void) implies (Result = (b = Void)) same_type: (Result and (a /= Void)) implies (b /= Void and then a.same_type (b)) symmetric: Result implies deep_equal (b, a) end frozen equal (a: detachable ANY; b: like arg #1): BOOLEAN -- Are a and b either both void or attached -- to objects considered equal? -- (from ANY) do if a = Void then Result := b = Void else Result := b /= Void and then a.is_equal (b) end ensure -- from ANY instance_free: class definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.is_equal (b)) end frozen is_deep_equal alias "≡≡≡" (other: INTERNAL): BOOLEAN -- Are Current and other attached to isomorphic object structures? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" ensure -- from ANY shallow_implies_deep: standard_is_equal (other) implies Result same_type: Result implies same_type (other) symmetric: Result implies other.is_deep_equal (Current) end is_equal (other: INTERNAL): BOOLEAN -- Is other attached to an object considered -- equal to current object? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" ensure -- from ANY symmetric: Result implies other ~ Current consistent: standard_is_equal (other) implies Result end frozen standard_equal (a: detachable ANY; b: like arg #1): BOOLEAN -- Are a and b either both void or attached to -- field-by-field identical objects of the same type? -- Always uses default object comparison criterion. -- (from ANY) do if a = Void then Result := b = Void else Result := b /= Void and then a.standard_is_equal (b) end ensure -- from ANY instance_free: class definition: Result = (a = Void and b = Void) or else ((a /= Void and b /= Void) and then a.standard_is_equal (b)) end frozen standard_is_equal alias "≜" (other: INTERNAL): BOOLEAN -- Is other attached to an object of the same type -- as current object, and field-by-field identical to it? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" ensure -- from ANY same_type: Result implies same_type (other) symmetric: Result implies other.standard_is_equal (Current) end feature -- Status report conforms_to (other: ANY): BOOLEAN -- Does type of current object conform to type -- of other (as per Eiffel: The Language, chapter 13)? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" end is_attached_type (a_type_id: INTEGER_32): BOOLEAN -- Is a_type_id an attached type? -- (from REFLECTOR) require -- from REFLECTOR a_type_non_negative: a_type_id >= 0 do Result := {ISE_RUNTIME}.is_attached_type (a_type_id) ensure -- from REFLECTOR instance_free: class end is_field_expanded (i: INTEGER_32; object: ANY): BOOLEAN -- Is i-th field of object a user-defined expanded attribute? require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) do Result := is_field_expanded_of_type (i, dynamic_type (object)) ensure instance_free: class end is_field_expanded_of_type (i: INTEGER_32; a_type_id: INTEGER_32): BOOLEAN -- Is i-th field of type a_type_id a user-defined expanded attribute? -- (from REFLECTOR) require -- from REFLECTOR a_type_non_negative: a_type_id >= 0 index_large_enough: i >= 1 index_small_enough: i <= field_count_of_type (a_type_id) do Result := {ISE_RUNTIME}.is_field_expanded_of_type (i, a_type_id) ensure -- from REFLECTOR instance_free: class end is_field_transient (i: INTEGER_32; object: ANY): BOOLEAN -- Is i-th field of object a transient attribute? -- I.e. an attribute that does not need to be stored? require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) do Result := is_field_transient_of_type (i, dynamic_type (object)) ensure instance_free: class end is_field_transient_of_type (i: INTEGER_32; a_type_id: INTEGER_32): BOOLEAN -- Is i-th field of object a transient attribute? -- I.e. an attribute that does not need to be stored? -- (from REFLECTOR) require -- from REFLECTOR a_type_non_negative: a_type_id >= 0 index_large_enough: i >= 1 index_small_enough: i <= field_count_of_type (a_type_id) do Result := {ISE_RUNTIME}.is_field_transient_of_type (i, a_type_id) ensure -- from REFLECTOR instance_free: class end is_marked (obj: separate ANY): BOOLEAN -- Is obj marked? -- (from OBJECT_GRAPH_MARKER) require -- from OBJECT_GRAPH_MARKER object_exists: obj /= Void do Result := {ISE_RUNTIME}.is_object_marked ($obj.to_pointer) ensure -- from OBJECT_GRAPH_MARKER instance_free: class end is_pre_ecma_mapping_disabled: BOOLEAN -- Are we mapping old names to new ECMA names? -- False means mapping STRING to STRING_8, INTEGER to INTEGER_32,... -- Redefine in descendants of REFLECTOR to modify the behavior of inspection queries of REFLECTOR. -- (from REFLECTOR_HELPER) do Result := False ensure -- from REFLECTOR_HELPER instance_free: class end is_special (object: ANY): BOOLEAN -- Is object a special object? require object_not_void: object /= Void do Result := is_special_type (dynamic_type (object)) ensure instance_free: class end is_special_any_type (type_id: INTEGER_32): BOOLEAN -- Is type represented by type_id represent -- a SPECIAL [XX] where XX is a reference type. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.is_special_of_reference_type (type_id) ensure -- from REFLECTOR instance_free: class end is_special_type (type_id: INTEGER_32): BOOLEAN -- Is type represented by type_id represent -- a SPECIAL [XX] where XX is a reference type -- or a basic expanded type (note that user-defined -- expanded types are excluded). -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.is_special_of_reference_or_basic_type (type_id) ensure -- from REFLECTOR instance_free: class end is_tuple (object: ANY): BOOLEAN -- Is object a TUPLE object? require object_not_void: object /= Void do Result := attached {TUPLE} object ensure instance_free: class end is_tuple_type (type_id: INTEGER_32): BOOLEAN -- Is type represented by type_id represent a TUPLE? -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.is_tuple_type (type_id) ensure -- from REFLECTOR instance_free: class end is_valid_type_string (s: READABLE_STRING_GENERAL): BOOLEAN -- Is s a valid string representation for a TYPE. -- (from REFLECTOR_HELPER) local l_type_name: STRING_32 l_start_pos, l_end_pos: INTEGER_32 l_class_type_name: STRING_32 l_parameters: like parameters_decomposition do if s /= Void and then not s.is_empty then create l_class_type_name.make_from_string_general (s); l_class_type_name.adjust l_start_pos := l_class_type_name.index_of ('['.to_character_32, 1) if l_start_pos > 1 then l_end_pos := l_class_type_name.count if l_class_type_name.item (l_end_pos) /= ']'.to_character_32 then l_end_pos := 0 end if l_end_pos = l_class_type_name.count and l_start_pos < l_end_pos and l_class_type_name.occurrences ('['.to_character_32) = l_class_type_name.occurrences (']'.to_character_32) then l_type_name := l_class_type_name.substring (1, l_start_pos - 1); l_type_name.adjust if is_valid_identifier (l_type_name) then l_parameters := parameters_decomposition (l_class_type_name.substring (l_start_pos + 1, l_end_pos - 1)) if l_parameters /= Void then from Result := True; l_parameters.start until l_parameters.after or not Result loop Result := is_valid_type_string (l_parameters.item); l_parameters.forth end end end end else Result := is_valid_identifier (l_class_type_name) end end ensure -- from REFLECTOR_HELPER instance_free: class end mapped_type (a_type: READABLE_STRING_GENERAL): READABLE_STRING_GENERAL -- If is_pre_ecma_mapping_disabled a_type, otherwise -- the mapped typed. -- (from REFLECTOR_HELPER) require -- from REFLECTOR_HELPER a_type_not_void: a_type /= Void local l_table: like Pre_ecma_type_mapping do if not is_pre_ecma_mapping_disabled then l_table := Pre_ecma_type_mapping; l_table.search (a_type) if l_table.found then Result := l_table.found_item end end if Result = Void then Result := a_type end ensure -- from REFLECTOR_HELPER instance_free: class mapped_type_not_void: Result /= Void end same_type (other: ANY): BOOLEAN -- Is type of current object identical to type of other? -- (from ANY) require -- from ANY other_not_void: other /= Void external "built_in" ensure -- from ANY definition: Result = (conforms_to (other) and other.conforms_to (Current)) end feature -- Element change set_boolean_field (i: INTEGER_32; object: ANY; value: BOOLEAN) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) boolean_field: field_type (i, object) = Boolean_type do Reflected_object.set_object (object); Reflected_object.set_boolean_field (i, value) ensure instance_free: class end set_character_32_field (i: INTEGER_32; object: ANY; value: CHARACTER_32) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) character_32_field: field_type (i, object) = Character_32_type do Reflected_object.set_object (object); Reflected_object.set_character_32_field (i, value) ensure instance_free: class end set_character_8_field (i: INTEGER_32; object: ANY; value: CHARACTER_8) -- Was declared in INTERNAL as synonym of set_character_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) character_8_field: field_type (i, object) = Character_8_type do Reflected_object.set_object (object); Reflected_object.set_character_8_field (i, value) ensure instance_free: class end set_character_field (i: INTEGER_32; object: ANY; value: CHARACTER_8) -- Was declared in INTERNAL as synonym of set_character_8_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) character_8_field: field_type (i, object) = Character_8_type do Reflected_object.set_object (object); Reflected_object.set_character_8_field (i, value) ensure instance_free: class end set_double_field (i: INTEGER_32; object: ANY; value: REAL_64) -- Was declared in INTERNAL as synonym of set_real_64_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) real_64_field: field_type (i, object) = Real_64_type do Reflected_object.set_object (object); Reflected_object.set_real_64_field (i, value) ensure instance_free: class end set_integer_16_field (i: INTEGER_32; object: ANY; value: INTEGER_16) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_16_field: field_type (i, object) = Integer_16_type do Reflected_object.set_object (object); Reflected_object.set_integer_16_field (i, value) ensure instance_free: class end set_integer_32_field (i: INTEGER_32; object: ANY; value: INTEGER_32) -- Was declared in INTERNAL as synonym of set_integer_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_32_field: field_type (i, object) = Integer_32_type do Reflected_object.set_object (object); Reflected_object.set_integer_32_field (i, value) ensure instance_free: class end set_integer_64_field (i: INTEGER_32; object: ANY; value: INTEGER_64) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_64_field: field_type (i, object) = Integer_64_type do Reflected_object.set_object (object); Reflected_object.set_integer_64_field (i, value) ensure instance_free: class end set_integer_8_field (i: INTEGER_32; object: ANY; value: INTEGER_8) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_8_field: field_type (i, object) = Integer_8_type do Reflected_object.set_object (object); Reflected_object.set_integer_8_field (i, value) ensure instance_free: class end set_integer_field (i: INTEGER_32; object: ANY; value: INTEGER_32) -- Was declared in INTERNAL as synonym of set_integer_32_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) integer_32_field: field_type (i, object) = Integer_32_type do Reflected_object.set_object (object); Reflected_object.set_integer_32_field (i, value) ensure instance_free: class end set_natural_16_field (i: INTEGER_32; object: ANY; value: NATURAL_16) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) natural_16_field: field_type (i, object) = Natural_16_type do Reflected_object.set_object (object); Reflected_object.set_natural_16_field (i, value) ensure instance_free: class end set_natural_32_field (i: INTEGER_32; object: ANY; value: NATURAL_32) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) natural_32_field: field_type (i, object) = Natural_32_type do Reflected_object.set_object (object); Reflected_object.set_natural_32_field (i, value) ensure instance_free: class end set_natural_64_field (i: INTEGER_32; object: ANY; value: NATURAL_64) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) natural_64_field: field_type (i, object) = Natural_64_type do Reflected_object.set_object (object); Reflected_object.set_natural_64_field (i, value) ensure instance_free: class end set_natural_8_field (i: INTEGER_32; object: ANY; value: NATURAL_8) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) natural_8_field: field_type (i, object) = Natural_8_type do Reflected_object.set_object (object); Reflected_object.set_natural_8_field (i, value) ensure instance_free: class end set_pointer_field (i: INTEGER_32; object: ANY; value: POINTER) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) pointer_field: field_type (i, object) = Pointer_type do Reflected_object.set_object (object); Reflected_object.set_pointer_field (i, value) ensure instance_free: class end set_real_32_field (i: INTEGER_32; object: ANY; value: REAL_32) -- Was declared in INTERNAL as synonym of set_real_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) real_32_field: field_type (i, object) = Real_32_type do Reflected_object.set_object (object); Reflected_object.set_real_32_field (i, value) ensure instance_free: class end set_real_64_field (i: INTEGER_32; object: ANY; value: REAL_64) -- Was declared in INTERNAL as synonym of set_double_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) real_64_field: field_type (i, object) = Real_64_type do Reflected_object.set_object (object); Reflected_object.set_real_64_field (i, value) ensure instance_free: class end set_real_field (i: INTEGER_32; object: ANY; value: REAL_32) -- Was declared in INTERNAL as synonym of set_real_32_field. require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) real_32_field: field_type (i, object) = Real_32_type do Reflected_object.set_object (object); Reflected_object.set_real_32_field (i, value) ensure instance_free: class end set_reference_field (i: INTEGER_32; object: ANY; value: detachable ANY) require object_not_void: object /= Void index_large_enough: i >= 1 index_small_enough: i <= field_count (object) reference_field: field_type (i, object) = Reference_type valid_value: is_attached_type (field_static_type_of_type (i, dynamic_type (object))) implies value /= Void value_conforms_to_field_static_type: value /= Void implies field_conforms_to (dynamic_type (value), field_static_type_of_type (i, dynamic_type (object))) do Reflected_object.set_object (object); Reflected_object.set_reference_field (i, value) ensure instance_free: class end feature -- Duplication frozen clone (other: detachable ANY): like other obsolete "Use `twin' instead. [2017-05-31]" -- Void if other is void; otherwise new object -- equal to other -- -- For non-void other, clone calls copy; -- to change copying/cloning semantics, redefine copy. -- (from ANY) do if other /= Void then Result := other.twin end ensure -- from ANY instance_free: class equal: Result ~ other end copy (other: INTERNAL) -- Update current object using fields of object attached -- to other, so as to yield equal objects. -- (from ANY) require -- from ANY other_not_void: other /= Void type_identity: same_type (other) external "built_in" ensure -- from ANY is_equal: Current ~ other end frozen deep_clone (other: detachable ANY): like other obsolete "Use `deep_twin' instead. [2017-05-31]" -- Void if other is void: otherwise, new object structure -- recursively duplicated from the one attached to other -- (from ANY) do if other /= Void then Result := other.deep_twin end ensure -- from ANY instance_free: class deep_equal: deep_equal (other, Result) end frozen deep_copy (other: INTERNAL) -- Effect equivalent to that of: -- copy (other . deep_twin) -- (from ANY) require -- from ANY other_not_void: other /= Void do copy (other.deep_twin) ensure -- from ANY deep_equal: deep_equal (Current, other) end frozen deep_twin: INTERNAL -- New object structure recursively duplicated from Current. -- (from ANY) external "built_in" ensure -- from ANY deep_twin_not_void: Result /= Void deep_equal: deep_equal (Current, Result) end frozen standard_clone (other: detachable ANY): like other obsolete "Use `standard_twin' instead. [2017-05-31]" -- Void if other is void; otherwise new object -- field-by-field identical to other. -- Always uses default copying semantics. -- (from ANY) do if other /= Void then Result := other.standard_twin end ensure -- from ANY instance_free: class equal: standard_equal (Result, other) end frozen standard_copy (other: INTERNAL) -- Copy every field of other onto corresponding field -- of current object. -- (from ANY) require -- from ANY other_not_void: other /= Void type_identity: same_type (other) external "built_in" ensure -- from ANY is_standard_equal: standard_is_equal (other) end frozen standard_twin: INTERNAL -- New object field-by-field identical to other. -- Always uses default copying semantics. -- (from ANY) external "built_in" ensure -- from ANY standard_twin_not_void: Result /= Void equal: standard_equal (Result, Current) end frozen twin: INTERNAL -- New object equal to Current -- twin calls copy; to change copying/twinning semantics, redefine copy. -- (from ANY) external "built_in" ensure -- from ANY twin_not_void: Result /= Void is_equal: Result ~ Current end feature -- Basic operations frozen as_attached: attached INTERNAL obsolete "Remove calls to this feature. [2017-05-31]" -- Attached version of Current. -- (Can be used during transitional period to convert -- non-void-safe classes to void-safe ones.) -- (from ANY) do Result := Current end frozen default: detachable INTERNAL -- Default value of object's type -- (from ANY) do end frozen default_pointer: POINTER -- Default value of type POINTER -- (Avoid the need to write p.default for -- some p of type POINTER.) -- (from ANY) do ensure -- from ANY instance_free: class end default_rescue -- Process exception for routines with no Rescue clause. -- (Default: do nothing.) -- (from ANY) do end frozen do_nothing -- Execute a null action. -- (from ANY) do ensure -- from ANY instance_free: class end feature {NONE} -- Implementation Id_to_storable_version: HASH_TABLE [detachable IMMUTABLE_STRING_8, INTEGER_32] -- Buffer for storable_version_of_type lookups index by type_id. -- (from REFLECTOR) once create Result.make (100) ensure -- from REFLECTOR instance_free: class id_to_storable_version_not_void: Result /= Void end Internal_dynamic_type_string_table: STRING_TABLE [INTEGER_32] -- Table of dynamic type indexed by type name -- (from REFLECTOR) once create Result.make (100) ensure -- from REFLECTOR instance_free: class internal_dynamic_type_string_table_not_void: Result /= Void end Reflected_object: REFLECTED_REFERENCE_OBJECT -- Abstraction to reflect on objects. once create Result.make ("") ensure instance_free: class end feature -- Conformance field_conforms_to (a_source_type, a_field_type: INTEGER_32): BOOLEAN -- Does a_source_type conform to a_field_type? -- (from REFLECTOR) require -- from REFLECTOR a_source_type_non_negative: a_source_type >= 0 a_field_type_non_negative: a_field_type >= 0 do Result := {ISE_RUNTIME}.type_conforms_to (a_source_type, {ISE_RUNTIME}.detachable_type (a_field_type)) ensure -- from REFLECTOR instance_free: class end is_instance_of (object: ANY; type_id: INTEGER_32): BOOLEAN -- Is object an instance of type type_id? require object_not_void: object /= Void type_id_nonnegative: type_id >= 0 do Result := type_conforms_to (dynamic_type (object), type_id) ensure instance_free: class end type_conforms_to (type1, type2: INTEGER_32): BOOLEAN -- Does type1 conform to type2? -- (from REFLECTOR) require -- from REFLECTOR type1_nonnegative: type1 >= 0 type2_nonnegative: type2 >= 0 do Result := {ISE_RUNTIME}.type_conforms_to (type1, type2) ensure -- from REFLECTOR instance_free: class end feature -- Creation dynamic_type_from_string (class_type: READABLE_STRING_GENERAL): INTEGER_32 -- Dynamic type corresponding to class_type. -- If no dynamic type available, returns -1. -- (from REFLECTOR) require -- from REFLECTOR class_type_not_void: class_type /= Void class_type_not_empty: not class_type.is_empty is_valid_type_string: is_valid_type_string (class_type) local l_cstr: C_STRING l_table: like Internal_dynamic_type_string_table l_pre_ecma_status: BOOLEAN do l_table := Internal_dynamic_type_string_table; l_table.search (class_type) if l_table.found then Result := l_table.found_item else create l_cstr.make (class_type) l_pre_ecma_status := {ISE_RUNTIME}.pre_ecma_mapping_status {ISE_RUNTIME}.set_pre_ecma_mapping (not is_pre_ecma_mapping_disabled) Result := {ISE_RUNTIME}.type_id_from_name (l_cstr.item) {ISE_RUNTIME}.set_pre_ecma_mapping (l_pre_ecma_status); l_table.put (Result, class_type) end ensure -- from REFLECTOR instance_free: class dynamic_type_from_string_valid: Result = -1 or Result = None_type or Result >= 0 end new_instance_of (type_id: INTEGER_32): ANY -- New instance of dynamic type_id. -- Note: returned object is not initialized and may -- hence violate its invariant. -- type_id cannot represent a SPECIAL type, use -- new_special_any_instance instead. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 not_special_type: not is_special_type (type_id) not_deferred: not type_of_type (type_id).is_deferred do Result := {ISE_RUNTIME}.new_instance_of (type_id) ensure -- from REFLECTOR instance_free: class not_special_type: not attached {SPECIAL [detachable ANY]} Result dynamic_type_set: attached_type (Result.generating_type.type_id) = attached_type (type_id) end new_special_any_instance (type_id, a_capacity: INTEGER_32): SPECIAL [detachable ANY] -- New instance of dynamic type_id that represents -- a SPECIAL which can contain a_capacity elements of reference type. -- To create a SPECIAL of basic type, use class SPECIAL directly. -- (from REFLECTOR) require -- from REFLECTOR a_capacity_valid: a_capacity >= 0 type_id_nonnegative: type_id >= 0 special_type: is_special_any_type (type_id) do Result := {ISE_RUNTIME}.new_special_of_reference_instance_of (type_id, a_capacity) ensure -- from REFLECTOR instance_free: class dynamic_type_set: Result.generating_type.type_id = type_id count_set: Result.count = 0 capacity_set: Result.capacity = a_capacity end new_tuple_from_special (type_id: INTEGER_32; values: SPECIAL [detachable separate ANY]): detachable TUPLE -- New instance of a tuple of type type_id filled with values if all types of items are suitable. -- Void if some items from values are inappropriate for a tuple of type type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 is_tuple_type: is_tuple_type (type_id) local i: INTEGER_32 v: detachable separate ANY do Result := {ISE_RUNTIME}.new_tuple_instance_of (type_id) i := Result.count if i <= values.count then from until i <= 0 or else not attached Result loop v := values [i - 1] if Result.valid_type_for_index (v, i) then Result [i] := v else Result := Void end i := i - 1 end else Result := Void end ensure -- from REFLECTOR instance_free: class dynamic_type_set: attached Result implies Result.generating_type.type_id = type_id values_set: attached Result implies ∀ k: 1 |..| Result.count ¦ Result.item (k) = values [k - 1] end new_tuple_from_tuple (type_id: INTEGER_32; source: separate TUPLE): detachable TUPLE -- New instance of a tuple of type type_id filled with values fom source if all value types are suitable. -- Void if some values from source are inappropriate for a tuple of type type_id. -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 is_tuple_type: is_tuple_type (type_id) local i: INTEGER_32 v: detachable separate ANY do Result := {ISE_RUNTIME}.new_tuple_instance_of (type_id) i := Result.count if i <= source.count then if source.object_comparison then Result.compare_objects end from until i <= 0 or else not attached Result loop v := source [i] if Result.valid_type_for_index (v, i) then Result [i] := v else Result := Void end i := i - 1 end else Result := Void end ensure -- from REFLECTOR instance_free: class dynamic_type_set: attached Result implies Result.generating_type.type_id = type_id object_comparison_set: attached Result implies Result.object_comparison = source.object_comparison values_set: attached Result implies ∀ k: 1 |..| Result.count ¦ Result.item (k) = source [k] end type_of (object: detachable ANY): TYPE [detachable ANY] -- Associated TYPE instance of object. do if object /= Void then Result := object.generating_type else Result := {NONE} end ensure instance_free: class result_not_void: Result /= Void end type_of_type (type_id: INTEGER_32): TYPE [detachable ANY] -- Associated TYPE instance for an object of type id type_id -- (from REFLECTOR) require -- from REFLECTOR type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.new_type_instance_of (type_id) ensure -- from REFLECTOR instance_free: class result_not_void: Result /= Void end feature {NONE} -- Decompose string type parameters_decomposition (a_str: READABLE_STRING_32): detachable ARRAYED_LIST [READABLE_STRING_32] -- Decompose a_str which should be of the form "A, B, D [G], H [E ,F]" -- into a list of strings "A", "B", "D [G]", "H [E, F]" -- If decomposition is not possible, Void. -- (from REFLECTOR_HELPER) require -- from REFLECTOR_HELPER a_str_not_void: a_str /= Void local i, nb: INTEGER_32 l_invalid: BOOLEAN l_first_pos: INTEGER_32 l_nesting: INTEGER_32 do from create Result.make (5) i := 1 l_first_pos := 1 nb := a_str.count until i > nb or l_invalid loop inspect a_str.item (i) when ',' then if l_nesting = 0 then Result.extend (a_str.substring (l_first_pos, i - 1)) l_first_pos := i + 1 end when '[' then l_nesting := l_nesting + 1 when ']' then l_nesting := l_nesting - 1 l_invalid := l_nesting < 0 else end i := i + 1 end if not l_invalid and then l_nesting = 0 then Result.extend (a_str.substring (l_first_pos, i - 1)) else Result := Void end ensure -- from REFLECTOR_HELPER instance_free: class end feature {NONE} -- ECMA mapping helper Attached_keyword: STRING_8 = "attached" -- (from REFLECTOR_HELPER) Attached_mark: CHARACTER_32 = '!' -- (from REFLECTOR_HELPER) Detachable_keyword: STRING_8 = "detachable" -- (from REFLECTOR_HELPER) Detachable_mark: CHARACTER_32 = '?' -- (from REFLECTOR_HELPER) Expanded_keyword: STRING_8 = "expanded" -- Symbols use for attachment marks. -- (from REFLECTOR_HELPER) Pre_ecma_type_mapping: STRING_TABLE [STRING_8] -- Mapping between pre-ECMA type naming and new names. -- (from REFLECTOR_HELPER) once create Result.make (12); Result.put ("STRING_8", "STRING"); Result.put ("INTEGER_32", "INTEGER"); Result.put ("INTEGER_32_REF", "INTEGER_REF"); Result.put ("CHARACTER_8", "CHARACTER"); Result.put ("CHARACTER_8_REF", "CHARACTER_REF"); Result.put ("CHARACTER_32", "WIDE_CHARACTER"); Result.put ("CHARACTER_32_REF", "WIDE_CHARACTER_REF"); Result.put ("REAL_32", "REAL"); Result.put ("REAL_32_REF", "REAL_REF"); Result.put ("REAL_64", "DOUBLE"); Result.put ("REAL_64_REF", "DOUBLE_REF") ensure -- from REFLECTOR_HELPER instance_free: class pre_ecma_type_mapping_not_void: Result /= Void end feature {NONE} -- Implementation: status report is_valid_identifier (s: READABLE_STRING_GENERAL): BOOLEAN -- Is s a valid Eiffel identifier? -- (from REFLECTOR_HELPER) require -- from REFLECTOR_HELPER name_not_void: s /= Void local i, nb: INTEGER_32 cc: CHARACTER_32 do if not s.is_empty then cc := s.item (1) nb := s.count + 1 if cc = Attached_mark or cc = Detachable_mark then i := 2 elseif s.substring_index (Attached_keyword, 1) = 1 then i := Attached_keyword.count + 1 elseif s.substring_index (Detachable_keyword, 1) = 1 then i := Detachable_keyword.count + 1 elseif s.substring_index (Expanded_keyword, 1) = 1 then i := Expanded_keyword.count + 1 else i := 1 end if i > 1 then from until i = nb or not s.item (i).is_space loop i := i + 1 end end if s.item (i).is_alpha then from Result := True until i = nb loop cc := s.item (i) if not (cc.is_alpha or cc.is_digit or cc = '_'.to_character_32) then Result := False i := nb - 1 end i := i + 1 end end end ensure -- from REFLECTOR_HELPER instance_free: class end feature -- Marking lock_marking -- Get a lock on mark and unmark routine so that 2 threads cannot mark and -- unmark at the same time. -- (from OBJECT_GRAPH_MARKER) do {ISE_RUNTIME}.lock_marking ensure -- from OBJECT_GRAPH_MARKER instance_free: class end mark (obj: separate ANY) -- Mark object obj. -- To be thread safe, make sure to call this feature when you -- have the marking lock that you acquire using lock_marking. -- (from OBJECT_GRAPH_MARKER) require -- from OBJECT_GRAPH_MARKER object_not_void: obj /= Void do {ISE_RUNTIME}.mark_object ($obj.to_pointer) ensure -- from OBJECT_GRAPH_MARKER instance_free: class is_marked: is_marked (obj) end unlock_marking -- Release a lock on mark and unmark, so that another thread can -- use mark and unmark. -- (from OBJECT_GRAPH_MARKER) do {ISE_RUNTIME}.unlock_marking ensure -- from OBJECT_GRAPH_MARKER instance_free: class end unmark (obj: separate ANY) -- Unmark object obj. -- To be thread safe, make sure to call this feature when you -- have the marking lock that you acquire using lock_marking. -- (from OBJECT_GRAPH_MARKER) require -- from OBJECT_GRAPH_MARKER object_not_void: obj /= Void do {ISE_RUNTIME}.unmark_object ($obj.to_pointer) ensure -- from OBJECT_GRAPH_MARKER instance_free: class is_not_marked: not is_marked (obj) end feature -- Output Io: STD_FILES -- Handle to standard file setup -- (from ANY) once create Result; Result.set_output_default ensure -- from ANY instance_free: class io_not_void: Result /= Void end out: STRING_8 -- New string containing terse printable representation -- of current object -- (from ANY) do Result := tagged_out ensure -- from ANY out_not_void: Result /= Void end print (o: detachable ANY) -- Write terse external representation of o -- on standard output. -- (from ANY) local s: READABLE_STRING_8 do if attached o then s := o.out if attached {READABLE_STRING_32} s as s32 then Io.put_string_32 (s32) elseif attached {READABLE_STRING_8} s as s8 then Io.put_string (s8) else Io.put_string_32 (s.as_string_32) end end ensure -- from ANY instance_free: class end frozen tagged_out: STRING_8 -- New string containing terse printable representation -- of current object -- (from ANY) external "built_in" ensure -- from ANY tagged_out_not_void: Result /= Void end feature -- Platform Operating_environment: OPERATING_ENVIRONMENT -- Objects available from the operating system -- (from ANY) once create Result ensure -- from ANY instance_free: class operating_environment_not_void: Result /= Void end feature -- Retrieval frozen internal_correct_mismatch -- Called from runtime to perform a proper dynamic dispatch on correct_mismatch -- from MISMATCH_CORRECTOR. -- (from ANY) local l_msg: STRING_32 l_exc: EXCEPTIONS do if attached {MISMATCH_CORRECTOR} Current as l_corrector then l_corrector.correct_mismatch else create l_msg.make_from_string ("Mismatch: ".as_string_32) create l_exc; l_msg.append (generating_type.name_32); l_exc.raise_retrieval_exception (l_msg) end end feature {NONE} -- Type creation Type_keyword: STRING_8 = "TYPE" -- Used for creating type objects. -- (from REFLECTOR_HELPER) feature -- Version compiler_version: INTEGER_32 -- (from REFLECTOR) do Result := 0 ensure -- from REFLECTOR instance_free: class end invariant -- from ANY reflexive_equality: standard_is_equal (Current) reflexive_conformance: conforms_to (Current) note copyright: "Copyright (c) 1984-2019, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software 5949 Hollister Ave., Goleta, CA 93117 USA Telephone 805-685-1006, Fax 805-685-6869 Website http://www.eiffel.com Customer support http://support.eiffel.com ]" end -- class INTERNAL
Generated by ISE EiffelStudio