note description: "[ Accessor to an object. Useful to manipulate fields of an object, or an expanded field of an object without causing any copying. If applied to an expanded type, a copy will be manipulated. ]" implementation_details: "[ The GC might be moving objects, some of the routines are actually builtin. ]" date: "$Date: 2017-03-23 19:18:26 +0000 (Thu, 23 Mar 2017) $" revision: "$Revision: 100033 $" class REFLECTED_REFERENCE_OBJECT create make create {REFLECTED_REFERENCE_OBJECT, RT_DBG_INTERNAL} make_for_expanded_field, make_for_expanded_field_at feature {NONE} -- Initialization default_create -- Process instances of classes with no creation clause. -- (Default: do nothing.) -- (from ANY) do end make (a_object: ANY) -- Setup a proxy to a_object. require not_expanded_object: True do enclosing_object := a_object dynamic_type := {ISE_RUNTIME}.dynamic_type (a_object) physical_offset := 0 ensure enclosing_object_set: enclosing_object = a_object no_physical_offset: physical_offset = 0 end make_for_expanded_field (a_enclosing_object: REFLECTED_REFERENCE_OBJECT; i: INTEGER_32) -- Setup a proxy to expanded field located at the i-th field of a_enclosing_object. require i_th_field_is_expanded: a_enclosing_object.is_field_statically_expanded (i) do enclosing_object := a_enclosing_object.enclosing_object physical_offset := a_enclosing_object.physical_offset + a_enclosing_object.field_offset (i) dynamic_type := {ISE_RUNTIME}.dynamic_type_at_offset ($enclosing_object.to_pointer, physical_offset) ensure enclosing_object_set: enclosing_object = a_enclosing_object.enclosing_object end make_for_expanded_field_at (a_enclosing_object: ANY; a_physical_offset: INTEGER_32) -- Setup a proxy to expanded field located at the a_physical_offset of a_enclosing_object. require not_dotnet: not {PLATFORM}.is_dotnet do enclosing_object := a_enclosing_object physical_offset := a_physical_offset dynamic_type := {ISE_RUNTIME}.dynamic_type_at_offset ($a_enclosing_object.to_pointer, a_physical_offset) ensure enclosing_object_set: enclosing_object = a_enclosing_object end feature -- Access Bit_type: INTEGER_32 = 8 -- This type is obsolete and is not used anymore. -- (from REFLECTOR_CONSTANTS) Boolean_type: INTEGER_32 = 3 -- Abstract type ID for predefined type BOOLEAN. -- (from REFLECTOR_CONSTANTS) 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_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_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: STRING_8 -- Name of the class associated with object -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.generator_of_type (dynamic_type) end copy_semantics_field (i: INTEGER_32): REFLECTED_COPY_SEMANTICS_OBJECT -- Object attached to the i-th field of object -- (directly or through a reference) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count not_special: not is_special reference_field: field_type (i) = Reference_type and is_copy_semantics_field (i) do create Result.make (twin, i) 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: INTEGER_32 -- Dynamic type of object -- (from REFLECTED_OBJECT) enclosing_object: separate ANY -- Enclosing object containing object or a reference to `object. expanded_field (i: INTEGER_32): REFLECTED_REFERENCE_OBJECT -- Object representation of the i-th field of object -- which is expanded. We provide a wrapper that enables -- direct editing of the field without duplicating -- the expanded object. require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count expanded_field: field_type (i) = Expanded_type not_special: not is_special do create Result.make_for_expanded_field (Current, i) end Expanded_type: INTEGER_32 = 7 -- Abstract type ID for a non-predefined expanded type. -- (from REFLECTOR_CONSTANTS) field (i: INTEGER_32): detachable ANY -- Object attached to the i-th field of object -- (directly or through a reference) -- Use specific version of xxx_field to get best performance. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count not_special: not is_special do inspect field_type (i) when Integer_8_type then Result := integer_8_field (i) when Integer_16_type then Result := integer_16_field (i) when Integer_32_type then Result := integer_32_field (i) when Integer_64_type then Result := integer_64_field (i) when Natural_8_type then Result := natural_8_field (i) when Natural_16_type then Result := natural_16_field (i) when Natural_32_type then Result := natural_32_field (i) when Natural_64_type then Result := natural_64_field (i) when Real_32_type then Result := real_32_field (i) when Real_64_type then Result := real_64_field (i) when Character_8_type then Result := character_8_field (i) when Character_32_type then Result := character_32_field (i) when Boolean_type then Result := boolean_field (i) when Pointer_type then Result := pointer_field (i) when Expanded_type, Reference_type then Result := reference_field (i) end end generating_type: TYPE [detachable REFLECTED_REFERENCE_OBJECT] -- 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: INTEGER_32 -- Number of generic parameter in base type of object. -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.generic_parameter_count (dynamic_type) end generic_dynamic_type (i: INTEGER_32): INTEGER_32 -- Dynamic type of generic parameter of object at -- position i. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT object_generic: generic_count > 0 i_valid: i > 0 and i <= generic_count do Result := {ISE_RUNTIME}.eif_gen_param_id (dynamic_type, i) ensure -- from REFLECTED_OBJECT dynamic_type_nonnegative: Result >= 0 end Integer_16_type: INTEGER_32 = 10 -- Abstract type ID for predefined type INTEGER_16. -- (from REFLECTOR_CONSTANTS) 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_type: INTEGER_32 = 11 -- Abstract type ID for predefined type INTEGER_64. -- (from REFLECTOR_CONSTANTS) Integer_8_type: INTEGER_32 = 9 -- Abstract type ID for predefined type INTEGER_8. -- (from REFLECTOR_CONSTANTS) 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_type: INTEGER_32 = 14 -- Abstract type ID for predefined type NATURAL_16. -- (from REFLECTOR_CONSTANTS) Natural_32_type: INTEGER_32 = 15 -- Abstract type ID for predefined type NATURAL_32. -- (from REFLECTOR_CONSTANTS) Natural_64_type: INTEGER_32 = 16 -- Abstract type ID for predefined type NATURAL_64. -- (from REFLECTOR_CONSTANTS) 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) object: ANY -- Associated object for Current. -- It might be a copy if Current is expanded. do Result := {ISE_RUNTIME}.reference_field_at_offset ($enclosing_object.to_pointer, physical_offset) end object_address: POINTER -- Unprotected reference to object. do Result := {ISE_RUNTIME}.raw_reference_field_at_offset ($enclosing_object.to_pointer, physical_offset) end physical_offset: INTEGER_32 -- Actual offset in bytes of object in enclosing_object. Pointer_type: INTEGER_32 = 0 -- Abstract type ID for predefined type POINTER. -- (from REFLECTOR_CONSTANTS) 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_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_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): detachable ANY -- Object attached to the i-th field of object -- (directly or through a reference) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count not_special: not is_special reference_field: field_type (i) = Reference_type or field_type (i) = Expanded_type do Result := {ISE_RUNTIME}.reference_field (i, object_address, 0) end Reference_type: INTEGER_32 = 1 -- Abstract type ID for a reference type. -- (from REFLECTOR_CONSTANTS) type_name: STRING_8 -- Name of object's generating type (type of which object -- is a direct instance). -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.generating_type_of_type (dynamic_type) 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: INTEGER_32 -- Space occupied by object and its children in bytes -- (from REFLECTED_OBJECT) local l_size: NATURAL_64 do l_size := deep_physical_size_64 Result := l_size.min ({INTEGER_32}.max_value.as_natural_64).as_integer_32 end deep_physical_size_64: NATURAL_64 -- Space occupied by object and its children in bytes -- (from REFLECTED_OBJECT) local l_traverse: OBJECT_GRAPH_BREADTH_FIRST_TRAVERSABLE l_obj: like {OBJECT_GRAPH_BREADTH_FIRST_TRAVERSABLE}.visited_objects.item 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 l_obj := l_objects.item Result := Result + {ISE_RUNTIME}.object_size ($l_obj.to_pointer); l_objects.forth end end end field_count: INTEGER_32 -- Number of logical fields in object -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.field_count_of_type (dynamic_type) end persistent_field_count: INTEGER_32 -- Number of logical fields in object that are not transient. -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.persistent_field_count_of_type (dynamic_type) ensure -- from REFLECTED_OBJECT count_positive: Result >= 0 end physical_size: INTEGER_32 -- Space occupied by object in bytes -- (from REFLECTED_OBJECT) local l_size: NATURAL_64 do l_size := physical_size_64 Result := l_size.min ({INTEGER_32}.max_value.as_natural_64).as_integer_32 end physical_size_64: NATURAL_64 -- Space occupied by object in bytes -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.object_size (object_address) 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: REFLECTED_REFERENCE_OBJECT): 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: REFLECTED_REFERENCE_OBJECT): 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: REFLECTED_REFERENCE_OBJECT): 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 boolean_field (i: INTEGER_32): BOOLEAN -- Boolean value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count boolean_field: field_type (i) = Boolean_type do Result := {ISE_RUNTIME}.boolean_field (i, object_address, 0) end character_32_field (i: INTEGER_32): CHARACTER_32 -- CHARACTER_32 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count character_32_field: field_type (i) = Character_32_type do Result := {ISE_RUNTIME}.character_32_field (i, object_address, 0) end character_8_field (i: INTEGER_32): CHARACTER_8 -- CHARACTER_8 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count character_8_field: field_type (i) = Character_8_type do Result := {ISE_RUNTIME}.character_8_field (i, object_address, 0) end 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 field_conforms_to (a_source_type, a_field_type: INTEGER_32): BOOLEAN -- Does a_source_type conform to a_field_type? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT 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)) end field_name (i: INTEGER_32): STRING_8 -- Name of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count not_special: not is_special do create Result.make_from_c ({ISE_RUNTIME}.field_name_of_type (i, dynamic_type)) ensure -- from REFLECTED_OBJECT result_exists: Result /= Void end field_offset (i: INTEGER_32): INTEGER_32 -- Offset of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count not_special: not is_special do Result := {ISE_RUNTIME}.field_offset_of_type (i, dynamic_type) end field_static_type (i: INTEGER_32): INTEGER_32 -- Static type of declared i-th field of dynamic type dynamic_type -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count do Result := {ISE_RUNTIME}.field_static_type_of_type (i, dynamic_type) ensure -- from REFLECTED_OBJECT field_type_nonnegative: Result >= 0 end field_type (i: INTEGER_32): INTEGER_32 -- Abstract type of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count do Result := {ISE_RUNTIME}.field_type_of_type (i, dynamic_type) ensure -- from REFLECTED_OBJECT field_type_nonnegative: Result >= 0 end integer_16_field (i: INTEGER_32): INTEGER_16 -- INTEGER_16 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_16_field: field_type (i) = Integer_16_type do Result := {ISE_RUNTIME}.integer_16_field (i, object_address, 0) end integer_32_field (i: INTEGER_32): INTEGER_32 -- INTEGER_32 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_32_field: field_type (i) = Integer_32_type do Result := {ISE_RUNTIME}.integer_32_field (i, object_address, 0) end integer_64_field (i: INTEGER_32): INTEGER_64 -- INTEGER_64 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_64_field: field_type (i) = Integer_64_type do Result := {ISE_RUNTIME}.integer_64_field (i, object_address, 0) end integer_8_field (i: INTEGER_32): INTEGER_8 -- INTEGER_8 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_8_field: field_type (i) = Integer_8_type do Result := {ISE_RUNTIME}.integer_8_field (i, object_address, 0) end is_copy_semantics_field (i: INTEGER_32): BOOLEAN -- Is i-th field of object a reference with copy-semantics properties? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count is_reference_field: field_type (i) = Reference_type do Result := {ISE_RUNTIME}.is_copy_semantics_field (i, object_address, 0) end is_expanded: BOOLEAN -- Is Current an instance of an expanded type? -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.is_expanded (object_address) end is_field_statically_attached (i: INTEGER_32): BOOLEAN -- Is i-th field of object defined as attached? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count do Result := {ISE_RUNTIME}.is_attached_type (field_static_type (i)) end is_field_statically_expanded (i: INTEGER_32): BOOLEAN -- Is i-th field of object a user-defined expanded attribute? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count do Result := {ISE_RUNTIME}.is_field_expanded_of_type (i, dynamic_type) end is_field_transient (i: INTEGER_32): BOOLEAN -- Is i-th field of object a transient attribute? -- I.e. an attribute that does not need to be stored? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count do Result := {ISE_RUNTIME}.is_field_transient_of_type (i, dynamic_type) end is_instance_of (type_id: INTEGER_32): BOOLEAN -- Is object an instance of type type_id? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT object_not_void: object /= Void type_id_nonnegative: type_id >= 0 do Result := {ISE_RUNTIME}.type_conforms_to (dynamic_type, type_id) end is_special: BOOLEAN -- Is object special? -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.is_special (object_address) end is_special_copy_semantics_item (i: INTEGER_32): BOOLEAN -- Is i-th field of object a reference with copy-semantics properties? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT is_special: is_special is_special_of_reference: is_special_of_reference valid_index: attached {ABSTRACT_SPECIAL} object as l_spec and then l_spec.valid_index (i) do Result := {ISE_RUNTIME}.is_special_copy_semantics_item (i, object_address) end is_special_of_expanded: BOOLEAN -- Is Current a SPECIAL [XX] where XX is a user defined expanded type? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT is_special: is_special do Result := {ISE_RUNTIME}.is_special_of_expanded (object_address) end is_special_of_reference: BOOLEAN -- Is Current a SPECIAL [XX] where XX is a reference type? -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT is_special: is_special do Result := {ISE_RUNTIME}.is_special_of_reference (object_address) end is_tuple: BOOLEAN -- Is object a TUPLE? -- (from REFLECTED_OBJECT) do Result := {ISE_RUNTIME}.is_tuple (object_address) end natural_16_field (i: INTEGER_32): NATURAL_16 -- NATURAL_16 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count natural_16_field: field_type (i) = Natural_16_type do Result := {ISE_RUNTIME}.natural_16_field (i, object_address, 0) end natural_32_field (i: INTEGER_32): NATURAL_32 -- NATURAL_32 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count natural_32_field: field_type (i) = Natural_32_type do Result := {ISE_RUNTIME}.natural_32_field (i, object_address, 0) end natural_64_field (i: INTEGER_32): NATURAL_64 -- NATURAL_64 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count natural_64_field: field_type (i) = Natural_64_type do Result := {ISE_RUNTIME}.natural_64_field (i, object_address, 0) end natural_8_field (i: INTEGER_32): NATURAL_8 -- NATURAL_8 value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count natural_8_field: field_type (i) = Natural_8_type do Result := {ISE_RUNTIME}.natural_8_field (i, object_address, 0) end pointer_field (i: INTEGER_32): POINTER -- Pointer value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count pointer_field: field_type (i) = Pointer_type do Result := {ISE_RUNTIME}.pointer_field (i, object_address, 0) end real_32_field (i: INTEGER_32): REAL_32 -- Real value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count real_32_field: field_type (i) = Real_32_type do Result := {ISE_RUNTIME}.real_32_field (i, object_address, 0) end real_64_field (i: INTEGER_32): REAL_64 -- Double precision value of i-th field of object -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count real_64_field: field_type (i) = Real_64_type do Result := {ISE_RUNTIME}.real_64_field (i, object_address, 0) 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 special_copy_semantics_item (i: INTEGER_32): REFLECTED_COPY_SEMANTICS_OBJECT -- Object attached to the ith item of special. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT is_special: is_special is_special_reference: is_special_of_reference valid_index: attached {ABSTRACT_SPECIAL} object as l_spec and then l_spec.valid_index (i) do create Result.make_special (twin, i) end feature -- Element change set_boolean_field (i: INTEGER_32; value: BOOLEAN) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count boolean_field: field_type (i) = Boolean_type do {ISE_RUNTIME}.set_boolean_field (i, object_address, 0, value) end set_character_32_field (i: INTEGER_32; value: CHARACTER_32) -- Set character 32 value of i-th field of object to value -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count character_field: field_type (i) = Character_32_type do {ISE_RUNTIME}.set_character_32_field (i, object_address, 0, value) end set_character_8_field (i: INTEGER_32; value: CHARACTER_8) -- Set character value of i-th field of object to value -- Was declared in REFLECTED_OBJECT as synonym of set_character_field. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count character_field: field_type (i) = Character_8_type do {ISE_RUNTIME}.set_character_8_field (i, object_address, 0, value) end set_character_field (i: INTEGER_32; value: CHARACTER_8) -- Set character value of i-th field of object to value -- Was declared in REFLECTED_OBJECT as synonym of set_character_8_field. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count character_field: field_type (i) = Character_8_type do {ISE_RUNTIME}.set_character_8_field (i, object_address, 0, value) end set_double_field (i: INTEGER_32; value: REAL_64) -- Was declared in REFLECTED_OBJECT as synonym of set_real_64_field. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count real_64_field: field_type (i) = Real_64_type do {ISE_RUNTIME}.set_real_64_field (i, object_address, 0, value) end set_integer_16_field (i: INTEGER_32; value: INTEGER_16) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_16_field: field_type (i) = Integer_16_type do {ISE_RUNTIME}.set_integer_16_field (i, object_address, 0, value) end set_integer_32_field (i: INTEGER_32; value: INTEGER_32) -- Was declared in REFLECTED_OBJECT as synonym of set_integer_field. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_32_field: field_type (i) = Integer_32_type do {ISE_RUNTIME}.set_integer_32_field (i, object_address, 0, value) end set_integer_64_field (i: INTEGER_32; value: INTEGER_64) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_64_field: field_type (i) = Integer_64_type do {ISE_RUNTIME}.set_integer_64_field (i, object_address, 0, value) end set_integer_8_field (i: INTEGER_32; value: INTEGER_8) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_8_field: field_type (i) = Integer_8_type do {ISE_RUNTIME}.set_integer_8_field (i, object_address, 0, value) end set_integer_field (i: INTEGER_32; value: INTEGER_32) -- Was declared in REFLECTED_OBJECT as synonym of set_integer_32_field. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count integer_32_field: field_type (i) = Integer_32_type do {ISE_RUNTIME}.set_integer_32_field (i, object_address, 0, value) end set_natural_16_field (i: INTEGER_32; value: NATURAL_16) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count natural_16_field: field_type (i) = Natural_16_type do {ISE_RUNTIME}.set_natural_16_field (i, object_address, 0, value) end set_natural_32_field (i: INTEGER_32; value: NATURAL_32) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count natural_32_field: field_type (i) = Natural_32_type do {ISE_RUNTIME}.set_natural_32_field (i, object_address, 0, value) end set_natural_64_field (i: INTEGER_32; value: NATURAL_64) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count natural_64_field: field_type (i) = Natural_64_type do {ISE_RUNTIME}.set_natural_64_field (i, object_address, 0, value) end set_natural_8_field (i: INTEGER_32; value: NATURAL_8) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count natural_8_field: field_type (i) = Natural_8_type do {ISE_RUNTIME}.set_natural_8_field (i, object_address, 0, value) end set_pointer_field (i: INTEGER_32; value: POINTER) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count pointer_field: field_type (i) = Pointer_type do {ISE_RUNTIME}.set_pointer_field (i, object_address, 0, value) end set_real_32_field (i: INTEGER_32; value: REAL_32) -- Was declared in REFLECTED_OBJECT as synonym of set_real_field. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count real_32_field: field_type (i) = Real_32_type do {ISE_RUNTIME}.set_real_32_field (i, object_address, 0, value) end set_real_64_field (i: INTEGER_32; value: REAL_64) -- Was declared in REFLECTED_OBJECT as synonym of set_double_field. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count real_64_field: field_type (i) = Real_64_type do {ISE_RUNTIME}.set_real_64_field (i, object_address, 0, value) end set_real_field (i: INTEGER_32; value: REAL_32) -- Was declared in REFLECTED_OBJECT as synonym of set_real_32_field. -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count real_32_field: field_type (i) = Real_32_type do {ISE_RUNTIME}.set_real_32_field (i, object_address, 0, value) end set_reference_field (i: INTEGER_32; value: detachable ANY) -- (from REFLECTED_OBJECT) require -- from REFLECTED_OBJECT index_large_enough: i >= 1 index_small_enough: i <= field_count reference_field: field_type (i) = Reference_type valid_value: is_field_statically_attached (i) implies value /= Void value_conforms_to_field_static_type: value /= Void implies field_conforms_to (value.generating_type.type_id, field_static_type (i)) do {ISE_RUNTIME}.set_reference_field (i, object_address, 0, value) 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: REFLECTED_REFERENCE_OBJECT) -- 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: REFLECTED_REFERENCE_OBJECT) -- 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: REFLECTED_REFERENCE_OBJECT -- 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: REFLECTED_REFERENCE_OBJECT) -- 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: REFLECTED_REFERENCE_OBJECT -- 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: REFLECTED_REFERENCE_OBJECT -- 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 REFLECTED_REFERENCE_OBJECT 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 REFLECTED_REFERENCE_OBJECT -- 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 -- 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 {NONE} -- 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 -- Settings set_object (a_obj: separate ANY) -- Update Current to represent a new reflected object. require physical_offset_not_set: physical_offset = 0 do enclosing_object := a_obj physical_offset := 0 dynamic_type := {ISE_RUNTIME}.dynamic_type (a_obj) ensure enclosing_object_set: enclosing_object = a_obj no_physical_offset: physical_offset = 0 end invariant -- from ANY reflexive_equality: standard_is_equal (Current) reflexive_conformance: conforms_to (Current) note copyright: "Copyright (c) 1984-2017, 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 REFLECTED_REFERENCE_OBJECT
Generated by ISE EiffelStudio