Re: Git development

Wolfgang Jansen <[email protected]> Fri, 14 Aug 2009 19:09:06 +0200
Newsgroups gmane.comp.lang.eiffel.gobo.devel
Organization University of Potsdam, Institute of Informatics
Message-ID <[email protected]>
Hi Howard,

Howard Thomson wrote:
>
> Hi Eric & Wolfgang,
>
> I would welcome a move to using Git as the SCM system for Gobo.
>
> I see that there is a useful page on wikipedia about git, with 
> reference to Windows implementations:
>
> http://en.wikipedia.org/wiki/Git_(software)#Implementation
>
> There is also an excellent website detailing how to use git ...
>
> http://progit.org/
>
> Regarding my own project:
>
> I have recently, I think [famous last words], reached stability with my
>
> GC when compiling with my modified 'gec', albeit that I have only so
>
> far tested it on Linux. A Win32 version should be a fairly trivial 
> adaptation,
>
> as it should be no more than adaptation of a single, smallish, routine.
>
> I am also thinking of renaming my project as 'guide',
>
> the Gobo-eiffel Users' Integrated Development Environment,
>
> from 'edp', the Eiffel Developers' Project. Although there a few
>
> classes [from other sources] that are LGPL, nearly all code that does
>
> not already derive from gobo, is EFFLv2 or MIT.
>
> I am very interested to hear about the introspection and debugger code, as
>
> I need such facilities for my intended future coding.
>
Description of introspection and debugger code may be really large.
Here, a short outline.
Descendant classes of ET_C_GENERATOR (extending the work of that class)
generate a description of the system to be compiled for use during runtime:
they extract information from objects of types
ET_DYNAMIC_SYSTEM, ET_DYNAMIC_TYPE etc. and puts
the information into objects of types ET_IN_SYSTEM, ET_IN_TYPE etc.
The resulting description is put onto C code (additional to the usual code)
using a special output mode of the persistence closure classes.
This code is C compiled, and the system description is available
during runtime (after a few adaptations at startup) as Eiffel objects.
More precisely, the root object of the description is provided by an 
external
routine that fetches the object's address from C code, the other objects
are then recursively available by Eiffel calls on the root object.
The attachment contains the interface of an example class
to show what kind of information is available during runtime.

Introspection for persistence closure and debugging differs in the amount
of information in the system description. For example, the debugger needs
information about routines but the persistence closure does not.
Moreover, in case of debugging many calls to the debugger have been 
inserted
into the "normal" code. The debugger then decides whether switching
into interactive mode (say a breakpoint has been reached)
or returning immediately to the caller.

Historically, the work started with the persistence closure.
I soon realized the introspection is a necessary prerequisite.
Then, having introspection, the idea was to utilize it also
for other purposes, e.g. for the "print" command of a debugger.
So, the debugger has been developed.

The approach to implement the persistence closure etc.
may be emphasized as follows:
The Eiffel compiler is written in Eiffel.
So, why not also implementing the Eiffel runtime system in Eiffel?  

BTW, does your GC mark/seep or move/compress? In the former case,
object marking may also be interesting when building the persistence 
closure.
Currently, the already seen objects are registered
in a DS_HASH_TABLE[INTEGER,POINTER]. This is inconvenient
because of the POINTER keys. Marking like the GC would be an
interesting alternative.

> One of the areas of the code generator that I intend to alter is the 
> polymorphic
>
> dispatch implementation, for two reasons:
>
> Firstly for rapid re-compilation, I want to be able to generate an 
> initial code package as
>
> an executable stub with dynamic library, where libraries register 
> their routine addresses
>
> with the runtime, with subsequent partial re-compilation code 
> generated as an additional
>
> dynamic library whose routines override the registered routines of the 
> initial library. This
>
> requires that routine dispatch be done using a tree data structure, of 
> some sort ...
>
> Secondly, I envisage that it should be possible, as with Java and 
> other languages [mostly interpreted ..],
>
> to dynamically add class libraries to an executable system, where such 
> libraries have been packaged,
>
> [compiled or otherwise verified against] to be compatible with classes 
> already in the current system.
>
> That would also require that the dispatch to reachable routines be 
> dynamically extendable.
>
This sounds very interesting. Extendibility of a program, dynamic 
linking etc. seems to be
necessary for contemporary software (otherwise, Eiffel will never have a 
chance).
>
> I am adapting my work on the Eiffel GUI toolkit derived from the 
> Fox-toolkit to use the Vision2 interface,
>
> providing an X11/Win32 all Eiffel GUI Toolkit, which has its 
> advantages ...
>
> I am working toward using LLVM as the basis for code generation for 
> native Eiffel routines, initially to emit
>
> LLVM assembler with llvm-as invocation, and with the possibility 
> [much] later of emitting machine code directly.
>
> I think using Git would assist in cooperation between myself and other 
> gobo-eiffel contributors and developers.
>
> Regards,
>
> Howard Thomson
>
> --
>
> "Only two things are infinite, the universe and human stupidity,
>
> and I'm not sure about the former." -- Albert Einstein
>


-- 
Dr. Wolfgang Jansen
University of Potsdam, Germany
Institute of Computer Science
Tel: +49 331 / 977 3047
mailto: [email protected]

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july

_______________________________________________
gobo-eiffel-develop mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gobo-eiffel-develop
in_type.html (text/html, 36.9 KB)
<!doctype html system>
<!-- Generated by SmallEiffel short -html1 style hooks -->
<html>
<head>
<title>
IN_TYPE: Eiffel class interface</title>
</head>
<body>
<pre>
<strong>deferred class interface</strong> <a href="in_type.html">IN_TYPE</a>

<strong>feature(s) from </strong><a href="introspection.html">INTROSPECTION</a>
<em>   -- Constants
</em>
   Boolean_ident: <a href="integer.html">INTEGER</a>

   Character_ident: <a href="integer.html">INTEGER</a>

   Integer_ident: <a href="integer.html">INTEGER</a>

   Int8_ident: <a href="integer.html">INTEGER</a>

   Int16_ident: <a href="integer.html">INTEGER</a>

   Int32_ident: <a href="integer.html">INTEGER</a>

   Int64_ident: <a href="integer.html">INTEGER</a>

   Real_ident: <a href="integer.html">INTEGER</a>

   Double_ident: <a href="integer.html">INTEGER</a>

   Pointer_ident: <a href="integer.html">INTEGER</a>

   String_ident: <a href="integer.html">INTEGER</a>

   Foreign_flag: <a href="integer.html">INTEGER</a>

   Scoop_flag: <a href="integer.html">INTEGER</a>

   No_gc_flag: <a href="integer.html">INTEGER</a>

   Reference_flag: <a href="integer.html">INTEGER</a>

   Separate_flag: <a href="integer.html">INTEGER</a>

   Expanded_flag: <a href="integer.html">INTEGER</a>

   Living_flag: <a href="integer.html">INTEGER</a>

   Native_array_flag: <a href="integer.html">INTEGER</a>

   Basic_expanded_flag: <a href="integer.html">INTEGER</a>

   Capacity_index_flag: <a href="integer.html">INTEGER</a>

   Tuple_flag: <a href="integer.html">INTEGER</a>

   Agent_flag: <a href="integer.html">INTEGER</a>

   Missing_id_flag: <a href="integer.html">INTEGER</a>

   Bits_flag: <a href="integer.html">INTEGER</a>

   Deep_reference_flag: <a href="integer.html">INTEGER</a>

   Invariant_flag: <a href="integer.html">INTEGER</a>

   Generic_flag: <a href="integer.html">INTEGER</a>

   Sedb_flag: <a href="integer.html">INTEGER</a>

   Do_flag: <a href="integer.html">INTEGER</a>

   External_flag: <a href="integer.html">INTEGER</a>

   Once_flag: <a href="integer.html">INTEGER</a>

   Deferred_flag: <a href="integer.html">INTEGER</a>

   Frozen_flag: <a href="integer.html">INTEGER</a>

   Creation_flag: <a href="integer.html">INTEGER</a>

   Rescue_flag: <a href="integer.html">INTEGER</a>

   No_current_flag: <a href="integer.html">INTEGER</a>

   Side_effect_flag: <a href="integer.html">INTEGER</a>

   Inline_flag: <a href="integer.html">INTEGER</a>

   Attribute_flag: <a href="integer.html">INTEGER</a>

   Constant_flag: <a href="integer.html">INTEGER</a>

   Unique_flag: <a href="integer.html">INTEGER</a>

   Precomputable_flag: <a href="integer.html">INTEGER</a>

   Target: <a href="integer.html">INTEGER</a>

   Argument: <a href="integer.html">INTEGER</a>

   Old_value: <a href="integer.html">INTEGER</a>

   Local_var: <a href="integer.html">INTEGER</a>

   Result_value: <a href="integer.html">INTEGER</a>

   runtime_system: <a href="intro_runtime_system.html">IN_RUNTIME_SYSTEM</a>
<em>      -- The actual IN_SYSTEM.
</em>
      <strong>ensure</strong>
         not_void: Result /= Void

<strong>feature(s) from </strong><a href="comparable.html">COMPARABLE</a>
   is_equal (other: like Current): <a href="boolean.html">BOOLEAN</a>
      <strong>require</strong>
         other /= Void
      <strong>ensure</strong>
         generating_type = other.generating_type implies Result = other.is_equal(Current);
         trichotomy: Result = (not (Current < other) and not (other < Current))

   infix "<" (other: <a href="in_type.html">IN_TYPE</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- Comparison by ident.
</em>
      <strong>require</strong>
         other_exists: other /= Void
      <strong>ensure</strong>
         asymmetric: Result implies not (other < Current)

   infix "<=" (other: like Current): <a href="boolean.html">BOOLEAN</a>
<em>      -- Is </em>Current<em> less than or equal </em>other<em>?
</em>
      <strong>require</strong>
         other_exists: other /= Void
      <strong>ensure</strong>
         definition: Result = (Current < other or is_equal(other))

   infix ">" (other: like Current): <a href="boolean.html">BOOLEAN</a>
<em>      -- Is </em>Current<em> strictly greater than </em>other<em>?
</em>
      <strong>require</strong>
         other_exists: other /= Void
      <strong>ensure</strong>
         definition: Result = (other < Current)

   infix ">=" (other: like Current): <a href="boolean.html">BOOLEAN</a>
<em>      -- Is </em>Current<em> greater than or equal than </em>other<em>?
</em>
      <strong>require</strong>
         other_exists: other /= Void
      <strong>ensure</strong>
         definition: Result = (other <= Current)

   in_range (lower, upper: like Current): <a href="boolean.html">BOOLEAN</a>
<em>      -- Return true if </em>Current<em> is in range [</em>lower<em>..</em>upper<em>]
</em>
      <strong>ensure</strong>
         Result = (Current >= lower and Current <= upper)

   compare (other: like Current): <a href="integer.html">INTEGER</a>
<em>      -- If current object equal to </em>other<em>, 0
      -- if smaller,  -1; if greater, 1.
</em>
      <strong>require</strong>
         other_exists: other /= Void
      <strong>ensure</strong>
         equal_zero: Result = 0 = is_equal(other);
         smaller_negative: Result = -1 = (Current < other);
         greater_positive: Result = 1 = (Current > other)

   three_way_comparison (other: like Current): <a href="integer.html">INTEGER</a>
<em>      -- If current object equal to </em>other<em>, 0
      -- if smaller,  -1; if greater, 1.
</em>
      <strong>require</strong>
         other_exists: other /= Void
      <strong>ensure</strong>
         equal_zero: Result = 0 = is_equal(other);
         smaller_negative: Result = -1 = (Current < other);
         greater_positive: Result = 1 = (Current > other)

   min (other: like Current): like Current
<em>      -- Minimum of </em>Current<em> and </em>other<em>.
</em>
      <strong>require</strong>
         other /= Void
      <strong>ensure</strong>
         Result <= Current and then Result <= other;
         compare(Result) = 0 or else other.compare(Result) = 0

   max (other: like Current): like Current
<em>      -- Maximum of </em>Current<em> and </em>other<em>.
</em>
      <strong>require</strong>
         other /= Void
      <strong>ensure</strong>
         Result >= Current and then Result >= other;
         compare(Result) = 0 or else other.compare(Result) = 0

<strong>feature(s) from </strong><a href="hashable.html">HASHABLE</a>
   hash_code: <a href="integer.html">INTEGER</a>
<em>      -- The hash-code value of </em>Current<em>.
</em>
      <strong>ensure</strong>
         good_hash_value: Result >= 0

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Access:
</em>
   generating_type: <a href="string.html">STRING</a>
<em>      -- Name of current object's generating type (type of
      -- which it is a direct instance).
</em>

   generator: <a href="string.html">STRING</a>
<em>      -- Name of current object's generating class (base class
      -- of the type of which it is a direct instance).
</em>

   stripped (other: <a href="general.html">GENERAL</a>): like other
<em>      -- Newly created object with fields copied from current object,
      -- but limited to attributes of type of </em>other<em>.
</em>
      <strong>require</strong>
         conformance: conforms_to(other)
      <strong>ensure</strong>
         stripped_to_other: Result.same_dynamic_type(other)

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Status report:
</em>
   conforms_to (other: <a href="general.html">GENERAL</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- Is dynamic type of </em>Current<em> a descendant of dynamic type of
      -- </em>other<em> ?
      --
      -- Note: because of automatic conversion from expanded to reference
      -- type when passing argument </em>other<em>, do not expect a correct
      -- behavior with  expanded types.
</em>
      <strong>require</strong>
         not is_expanded_type;
         other_not_void: other /= Void

   same_dynamic_type (other: like Current): <a href="boolean.html">BOOLEAN</a>
<em>      -- Is the dynamic type of </em>Current<em> identical to the dynamic type 
      -- of </em>other<em>?
</em>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Comparison:
</em>
   equal (some: <a href="any.html">ANY</a>; other: like some): <a href="boolean.html">BOOLEAN</a>
<em>      -- Are </em>some<em> and </em>other<em> both Void or attached to objects 
      -- considered equal ?
</em>
      <strong>ensure</strong>
         symmetric: Result implies equal(other,some)

   standard_equal (some: <a href="any.html">ANY</a>; other: like some): <a href="boolean.html">BOOLEAN</a>
<em>      -- Are </em>some<em> and </em>other<em> both Void or attached to
      -- field-by-field objects of the same type ?
      -- Always use the default object comparison criterion.
</em>
      <strong>ensure</strong>
         definition: Result = (some = Void and other = Void) or else some /= Void and other /= Void and then some.standard_is_equal(other)

   standard_is_equal (other: like Current): <a href="boolean.html">BOOLEAN</a>
<em>      -- Are Current and </em>other<em> field-by-field identical?
</em>
      <strong>require</strong>
         other /= Void
      <strong>ensure</strong>
         same_dynamic_type(other) implies Result = other.standard_is_equal(Current)

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Deep Comparison:
</em>
   deep_equal (some: <a href="any.html">ANY</a>; other: like some): <a href="boolean.html">BOOLEAN</a>
<em>      -- Are </em>some<em> and </em>other<em> either both Void or attached to
      -- recursively isomorphic object structures ?
</em>
      <strong>ensure</strong>
         shallow_implies_deep: standard_equal(some,other) implies Result

   is_deep_equal (other: like Current): <a href="boolean.html">BOOLEAN</a>
<em>      -- Is </em>Current<em> recursively isomorph with </em>other<em> ?
</em>
      <strong>require</strong>
         other_not_void: other /= Void

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Duplication:
</em>
   clone (other: <a href="any.html">ANY</a>): like other
<em>      -- When argument </em>other<em> is Void, return Void otherwise 
      -- return </em>other.twin<em>.
</em>
      <strong>ensure</strong>
         equal: equal(Result,other)

   twin: like Current
<em>      -- Return a new object with the dynamic type of Current.
      -- Before being returned, the new object is initialized using
      -- feature </em>copy<em> (Current is passed as the argument).
      -- Thus, when feature </em>copy<em> of GENERAL is not redefined,
      -- </em>twin<em> has exactly the same behaviour as </em>standard_twin<em>.
</em>
      <strong>ensure</strong>
         equal: Result.is_equal(Current)

   copy (other: like Current)
      <strong>require</strong>
         same_dynamic_type(other)
      <strong>ensure</strong>
         is_equal(other)

   standard_clone (other: <a href="any.html">ANY</a>): like other
<em>      -- Void if </em>other<em> is Void; otherwise new object
      -- field-by-field identical to </em>other<em>.
      -- Always use the default copying semantics.
</em>
      <strong>ensure</strong>
         equal: standard_equal(Result,other)

   standard_twin: like Current
<em>      -- Return a new object with the dynamic type of Current.
      -- Before being returned, the new object is initialized using
      -- feature </em>standard_copy<em> (Current is passed as the argument).
</em>

   standard_copy (other: like Current)
<em>      -- Copy every field of </em>other<em> onto corresponding field of
      -- current object.
</em>
      <strong>require</strong>
         other_not_void: other /= Void
      <strong>ensure</strong>
         standard_is_equal(other)

   box: <a href="reference.html">REFERENCE</a>[like Current]
<em>      -- Create a REFERENCe object referring to Current 
</em>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Deep Duplication:
</em>
   deep_clone (other: <a href="any.html">ANY</a>): like other
<em>      -- When argument </em>other<em> is Void, return Void
      -- otherwise return </em>other.deep_twin<em>.
</em>
      <strong>ensure</strong>
         deep_equal(other,Result)

   deep_twin: like Current
<em>      -- Return a new object with the dynamic type of Current.
      -- The new object structure is recursively duplicated from the one
      -- attached to </em>Current<em>.
</em>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Basic operations:
</em>
   default: like Current
<em>      -- Default value of entities declared with the </em>Current<em> type.
      -- Hence, the </em>Result<em> is Void for all reference types and, as another 
      -- example, the </em>Result<em> is 0 for an INTEGER expression.
</em>

   is_default: <a href="boolean.html">BOOLEAN</a>
<em>      -- Is the </em>Current<em> object in the </em>default<em> state?
      -- For example, when this feature is applied on an INTEGER, the 
      -- </em>Result<em> is True only when the INTEGER is 0.  If not redefined, the 
      -- </em>Result<em> is always False for a reference expression. Actually, this 
      -- </em>is_default<em> predicate may be useful for user-defined expanded 
      -- objects stored in collection (see </em>all_default<em> of class 
      -- COLLECTION).
</em>

   default_pointer: <a href="pointer.html">POINTER</a>
<em>      -- Default value of type POINTER (avoid the need to write p.default 
      -- for some </em>p<em> of type POINTER).
</em>
      <strong>ensure</strong>
         Result = Result.default

   default_rescue
<em>      -- Handle exception if no Rescue clause. (Default: do nothing.)
</em>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Input and Output:
</em>
   io: <a href="std_input_output.html">STD_INPUT_OUTPUT</a>
<em>      -- Handle to standard file setup.
      -- To use the standard input/output file.
      -- Has type STD_FILES in ELKS 95.
</em>
      <strong>ensure</strong>
         Result /= Void

   std_input: <a href="std_input.html">STD_INPUT</a>
<em>      -- To use the standard input file.
</em>

   std_output: <a href="std_output.html">STD_OUTPUT</a>
<em>      -- To use the standard output file.
</em>

   std_error: <a href="std_error.html">STD_ERROR</a>
<em>      -- To use the standard error file.
</em>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Object Printing:
</em>
   print (some: <a href="general.html">GENERAL</a>)
<em>      -- Write terse external representation of </em>some<em> on
      -- </em>standard_output<em>.
      -- To customize printing, one may redefine
      -- </em>fill_tagged_out_memory<em> or </em>out_in_tagged_out_memory<em> (see
      -- for example how it works in class COLLECTION).
      -- Not frozen in ELKS 95.
</em>

   print_on (file: <a href="output_stream.html">OUTPUT_STREAM</a>)
<em>      -- Default printing of current object on a </em>file<em>.
      -- One may redefine </em>fill_tagged_out_memory<em> or
      -- </em>out_in_tagged_out_memory<em> to adapt the behavior of
      -- </em>print_on<em>.
      --
</em>

   tagged_out: <a href="string.html">STRING</a>
<em>      -- New string containing printable representation of current
      -- object, each field preceded by its attribute name, a
      -- colon and a space.
</em>

   out: <a href="string.html">STRING</a>

   out_in_tagged_out_memory
<em>      -- Append terse printable represention of current object
      -- in </em>tagged_out_memory<em>.
</em>
      <strong>ensure</strong>
         not_cleared: tagged_out_memory.count >= old tagged_out_memory.count;
         append_only: (old tagged_out_memory.twin).is_equal(tagged_out_memory.substring(1,old tagged_out_memory.count))

   tagged_out_memory: <a href="string.html">STRING</a>

   fill_tagged_out_memory
<em>      -- Append a viewable information in </em>tagged_out_memory<em> in
      -- order to affect the behavior of </em>out<em>, </em>tagged_out<em>, etc.
</em>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Access to command-line arguments:
</em>
   argument_count: <a href="integer.html">INTEGER</a>
<em>      -- Number of arguments given to command that started
      -- system execution (command name does not count).
</em>
      <strong>ensure</strong>
         Result >= 0

   argument (i: <a href="integer.html">INTEGER</a>): <a href="string.html">STRING</a>
<em>      -- </em>i<em> th argument of command that started system execution
      -- Gives the command name if </em>i<em> is 0.
</em>
      <strong>require</strong>
         i >= 0;
         i <= argument_count
      <strong>ensure</strong>
         Result /= Void

   command_arguments: <a href="fast_array.html">FAST_ARRAY</a>[<a href="string.html">STRING</a>]
<em>      -- Give acces to arguments command line including the
      -- command name at index 0.
</em>
      <strong>ensure</strong>
         not Result.is_empty

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- SCOOP:
</em>
   available: <a href="boolean.html">BOOLEAN</a>
<em>      -- Wait the result (By Necessity [TM])
      -- Always return True
      -- (Meaningless in a non-SCOOP world)
</em>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- System calls and crashs:
</em>
   crash
<em>      -- Print Run Time Stack and then exit with </em>exit_failure_code<em>.
</em>

   trace_switch (flag: <a href="boolean.html">BOOLEAN</a>)
<em>      -- May be used in combination with option "-sedb" of command
      -- </em>compile_to_c<em> (see compile_to_c documentation for details).
</em>

   sedb_breakpoint
<em>      -- May be used in combination with option "-sedb" of command
      -- </em>compile_to_c<em> to set a breakpoint for sedb, the SmartEiffel debugger.
</em>

   die_with_code (code: <a href="integer.html">INTEGER</a>)
<em>      -- Terminate execution with exit status code </em>code<em>.
      -- Do not print any message.
      -- Note: you can use predefined </em>exit_success_code<em> or
      -- </em>exit_failure_code<em> as well as another code you need.
</em>

   exit_success_code: <a href="integer.html">INTEGER</a>

   exit_failure_code: <a href="integer.html">INTEGER</a>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Should not exist:
</em>
   not_yet_implemented

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- For ELS Compatibility:
</em>
   id_object (id: <a href="integer.html">INTEGER</a>): <a href="any.html">ANY</a>
<em>      -- Object for which </em>object_id<em> has returned </em>id<em>
      -- Void if none.
</em>
      <strong>require</strong>
         id /= 0

   object_id: <a href="integer.html">INTEGER</a>
<em>      -- Value identifying current reference object.
</em>
      <strong>require</strong>
         not is_expanded_type

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- The Guru section:
</em>
   to_pointer: <a href="pointer.html">POINTER</a>
<em>      -- This routine can be used only if the value of </em>Current<em> is really
      -- a memory address. (This is the case for all reference types and
      -- for the NATIVE_ARRAY type only.) Actually, this routine do
      -- nothing: the value of </em>Current<em> which is an address is returned
      -- unchanged. The compiler will emit a warning if you try to use
      -- </em>to_pointer<em> on some invalid type.
</em>

   is_expanded_type: <a href="boolean.html">BOOLEAN</a>
<em>      -- Target is not evaluated (Statically computed).
      -- Result is True if target static type is an expanded type.
      -- Useful for formal generic type.
</em>

   is_basic_expanded_type: <a href="boolean.html">BOOLEAN</a>
<em>      -- Target is not evaluated (Statically computed).
      -- Result is True if target static type is one of the
      -- following types: BOOLEAN, CHARACTER, INTEGER, REAL,
      -- DOUBLE or POINTER.
</em>
      <strong>ensure</strong>
         Result implies is_expanded_type

   object_size: <a href="integer.html">INTEGER</a>
<em>      -- Gives the size of the current object at first level
      -- only (pointed-to sub-object are not concerned).
      -- The result is given in number of CHARACTER.
</em>

<strong>feature(s) from </strong><a href="general.html">GENERAL</a>
<em>   -- Implementation of GENERAL (do not use directly):
</em>
   se_assigned_from (other: <a href="general.html">GENERAL</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- To implement </em>conforms_to<em> (must only be called inside
      -- </em>conforms_to<em> because of VJRV rule).
</em>
      <strong>require</strong>
         not is_expanded_type

<strong>feature(s) from </strong><a href="intro_base.html">IN_BASE</a>
<em>   -- Access
</em>
   name: <a href="string.html">STRING</a>
      <strong>ensure</strong>
         not_void: Result /= Void

<strong>feature(s) from </strong><a href="intro_base.html">IN_BASE</a>
<em>   -- Status
</em>
   has_name (s: <a href="string.html">STRING</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- Is </em>name<em> equal to </em>s<em> when ignoring letter case?
</em>
      <strong>require</strong>
         not_void: s /= Void

   name_has_prefix (s: <a href="string.html">STRING</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- Does </em>name<em> start with </em>s <em>when ignoring latter case?
</em>
      <strong>require</strong>
         not_void: s /= Void

<strong>feature(s) from </strong><a href="intro_base.html">IN_BASE</a>
<em>   -- Basic operation
</em>
   append_name (str: <a href="string.html">STRING</a>)
<em>      -- Append </em>name<em> to </em>s<em>.
</em>
      <strong>require</strong>
         not_void: str /= Void
      <strong>ensure</strong>
         appended: str.has_suffix(name)

<strong>feature(s) from </strong><a href="intro_base.html">IN_BASE</a>
<em>   -- COMPARABLE
</em>
   compare_name (nm: <a href="string.html">STRING</a>): <a href="integer.html">INTEGER</a>
<em>      -- Compare </em>Current<em>'s name with </em>nm<em> in the sense 
      -- of </em>three_way_comparison<em>. 
</em>

   same_name (other: <a href="intro_base.html">IN_BASE</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- Have </em>Current<em> and </em>other<em> the same name?
</em>

<strong>feature(s) from </strong><a href="platform.html">PLATFORM</a>
<em>   -- Maximum:
</em>
   Maximum_character_code: <a href="integer_16.html">INTEGER_16</a>
<em>      -- Largest supported code for CHARACTER values.
</em>
      <strong>ensure</strong>
         meaningful: Result >= 127

   Maximum_integer_8: <a href="integer_8.html">INTEGER_8</a>
<em>      -- Largest supported value of type INTEGER_8.
</em>

   Maximum_integer_16: <a href="integer_16.html">INTEGER_16</a>
<em>      -- Largest supported value of type INTEGER_16.
</em>

   Maximum_integer: <a href="integer.html">INTEGER</a>
<em>      -- Largest supported value of type INTEGER/INTEGER_32.
</em>

   Maximum_integer_32: <a href="integer.html">INTEGER</a>
<em>      -- Largest supported value of type INTEGER/INTEGER_32.
</em>

   Maximum_integer_64: <a href="integer_64.html">INTEGER_64</a>
<em>      -- Largest supported value of type INTEGER_64.
</em>

   Maximum_real: <a href="real.html">REAL</a>
<em>      -- Largest supported value of type REAL.
</em>
      <strong>ensure</strong>
         meaningful: Result >= 0.0

   Maximum_double: <a href="double.html">DOUBLE</a>
<em>      -- Largest supported value of type DOUBLE.
</em>
      <strong>ensure</strong>
         meaningful: Result >= Maximum_real

<strong>feature(s) from </strong><a href="platform.html">PLATFORM</a>
<em>   -- Minimum:
</em>
   Minimum_character_code: <a href="integer_16.html">INTEGER_16</a>
<em>      -- Smallest supported code for CHARACTER values.
</em>
      <strong>ensure</strong>
         meaningful: Result <= 0

   Minimum_integer_8: <a href="integer_8.html">INTEGER_8</a>
<em>      -- Smallest supported value of type INTEGER_8.
</em>

   Minimum_integer_16: <a href="integer_16.html">INTEGER_16</a>
<em>      -- Smallest supported value of type INTEGER_16.
</em>

   Minimum_integer: <a href="integer.html">INTEGER</a>
<em>      -- Smallest supported value of type INTEGER/INTEGER_32.
</em>

   Minimum_integer_32: <a href="integer.html">INTEGER</a>
<em>      -- Smallest supported value of type INTEGER/INTEGER_32.
</em>

   Minimum_integer_64: <a href="integer_64.html">INTEGER_64</a>
<em>      -- Smallest supported value of type INTEGER_64.
</em>

   Minimum_double: <a href="double.html">DOUBLE</a>
<em>      -- Smallest supported value of type DOUBLE.
</em>
      <strong>ensure</strong>
         meaningful: Result <= 0.0

   Minimum_real: <a href="real.html">REAL</a>
<em>      -- Smallest supported value of type REAL.
</em>
      <strong>ensure</strong>
         meaningful: Result <= 0.0

<strong>feature(s) from </strong><a href="platform.html">PLATFORM</a>
<em>   -- Bits:
</em>
   Boolean_bits: <a href="integer.html">INTEGER</a>
<em>      -- Number of bits in a value of type BOOLEAN.
</em>
      <strong>ensure</strong>
         meaningful: Result >= 1

   Character_bits: <a href="integer.html">INTEGER</a>
<em>      -- Number of bits in a value of type CHARACTER.
</em>
      <strong>ensure</strong>
         meaningful: Result >= 1;
         large_enough: (2).to_integer_32 ^ Result >= Maximum_character_code

   Integer_bits: <a href="integer.html">INTEGER</a>
<em>      -- Number of bits in a value of type INTEGER.
</em>
      <strong>ensure</strong>
         integer_definition: Result = 32

   Real_bits: <a href="integer.html">INTEGER</a>
<em>      -- Number of bits in a value of type REAL.
</em>
      <strong>ensure</strong>
         meaningful: Result >= 1

   Double_bits: <a href="integer.html">INTEGER</a>
<em>      -- Number of bits in a value of type DOUBLE.
</em>
      <strong>ensure</strong>
         meaningful: Result >= 1;
         meaningful: Result >= Real_bits

   Pointer_bits: <a href="integer.html">INTEGER</a>
<em>      -- Number of bits in a value of type POINTER.
</em>

<strong>feature(s) from </strong><a href="in_type.html">IN_TYPE</a>
<em>   -- Access
</em>
   ident: <a href="integer.html">INTEGER</a>
<em>      -- System wide unique identifier.
</em>

   bit_count: <a href="integer.html">INTEGER</a>
<em>      -- Number of bits if is a BIT_N type.
</em>

   base_class: <a href="intro_class.html">IN_CLASS_TEXT</a>
<em>      -- Type descriptor of base type.
</em>

   generic_count: <a href="integer.html">INTEGER</a>
<em>      -- Number of generics parameters.
</em>
      <strong>ensure</strong>
         not_negative: Result >= 0

   valid_generic (i: <a href="integer.html">INTEGER</a>): <a href="boolean.html">BOOLEAN</a>
      <strong>ensure</strong>
         validity: Result = (0 <= i and then i < generic_count)

   generic_at (i: <a href="integer.html">INTEGER</a>): <a href="in_type.html">IN_TYPE</a>
<em>      -- Type of the </em>i<em>-th actual generic parameter. 
</em>
      <strong>require</strong>
         valid_index: valid_generic(i)
      <strong>ensure</strong>
         result_not_void: Result /= Void

   effector_count: <a href="integer.html">INTEGER</a>
<em>      -- Number of </em>Currents<em>'s effecting types. 
</em>
      <strong>ensure</strong>
         not_negative: Result >= 0

   valid_effector (i: <a href="integer.html">INTEGER</a>): <a href="boolean.html">BOOLEAN</a>
      <strong>ensure</strong>
         validity: Result = (0 <= i and then i < effector_count)

   effector_at (i: <a href="integer.html">INTEGER</a>): <a href="in_type.html">IN_TYPE</a>
<em>      -- Type of </em>i<em>-th effective descentant.
</em>
      <strong>require</strong>
         valid: valid_effector(i)

   attribute_count: <a href="integer.html">INTEGER</a>
<em>      -- Number of variable attributes.
</em>
      <strong>ensure</strong>
         not_negative: Result >= 0

   valid_attribute (i: <a href="integer.html">INTEGER</a>): <a href="boolean.html">BOOLEAN</a>
      <strong>ensure</strong>
         validity: Result = (0 <= i and then i < attribute_count)

   attribute_at (i: <a href="integer.html">INTEGER</a>): <a href="intro_field.html">IN_FIELD</a>
<em>      -- </em>i<em>-th variable attribute. 
</em>
      <strong>require</strong>
         valid_index: valid_attribute(i)
      <strong>ensure</strong>
         not_void: Result /= Void

   constant_count: <a href="integer.html">INTEGER</a>
<em>      -- Number of constant attributes.
</em>
      <strong>ensure</strong>
         not_negative: Result >= 0

   valid_constant (i: <a href="integer.html">INTEGER</a>): <a href="boolean.html">BOOLEAN</a>
      <strong>ensure</strong>
         validity: Result = (0 <= i and then i < constant_count)

   constant_at (i: <a href="integer.html">INTEGER</a>): <a href="intro_const.html">IN_CONST</a>[<a href="any.html">ANY</a>]
<em>      -- </em>i<em>-th constant attribute. 
</em>
      <strong>require</strong>
         valid_index: valid_constant(i)
      <strong>ensure</strong>
         not_void: Result /= Void

   routine_count: <a href="integer.html">INTEGER</a>
<em>      -- Number of routines.
</em>
      <strong>ensure</strong>
         not_negative: Result >= 0

   valid_routine (i: <a href="integer.html">INTEGER</a>): <a href="boolean.html">BOOLEAN</a>
      <strong>ensure</strong>
         validity: Result = (0 <= i and then i < routine_count)

   routine_at (i: <a href="integer.html">INTEGER</a>): <a href="intro_routine.html">IN_ROUTINE</a>
<em>      -- </em>i<em>-th routine.
</em>
      <strong>require</strong>
         valid_index: valid_routine(i)

   invariant_function: like routine_at
<em>      -- Function computing the class invariant.
</em>

   has_bracket: <a href="boolean.html">BOOLEAN</a>
<em>      -- Has </em>Current<em> a bracket function?
</em>

   bracket: <a href="intro_routine.html">IN_ROUTINE</a>
<em>      -- The type's bracket function, if any.
</em>

<strong>feature(s) from </strong><a href="in_type.html">IN_TYPE</a>
<em>   -- Status
</em>
   flags: <a href="integer.html">INTEGER</a>

   is_expanded: <a href="boolean.html">BOOLEAN</a>

   is_basic_expanded: <a href="boolean.html">BOOLEAN</a>
      <strong>ensure</strong>
         is_expanded: Result implies is_expanded

   is_reference: <a href="boolean.html">BOOLEAN</a>

   is_separate: <a href="boolean.html">BOOLEAN</a>

   is_none: <a href="boolean.html">BOOLEAN</a>

   is_boolean: <a href="boolean.html">BOOLEAN</a>

   is_character: <a href="boolean.html">BOOLEAN</a>

   is_integer: <a href="boolean.html">BOOLEAN</a>

   is_real: <a href="boolean.html">BOOLEAN</a>

   is_double: <a href="boolean.html">BOOLEAN</a>

   is_pointer: <a href="boolean.html">BOOLEAN</a>

   is_char8: <a href="boolean.html">BOOLEAN</a>

   is_char32: <a href="boolean.html">BOOLEAN</a>

   is_int8: <a href="boolean.html">BOOLEAN</a>

   is_int16: <a href="boolean.html">BOOLEAN</a>

   is_int32: <a href="boolean.html">BOOLEAN</a>

   is_int64: <a href="boolean.html">BOOLEAN</a>

   is_nat8: <a href="boolean.html">BOOLEAN</a>

   is_nat16: <a href="boolean.html">BOOLEAN</a>

   is_nat32: <a href="boolean.html">BOOLEAN</a>

   is_nat64: <a href="boolean.html">BOOLEAN</a>

   is_bit_n: <a href="boolean.html">BOOLEAN</a>

   is_string: <a href="boolean.html">BOOLEAN</a>

   is_unicode: <a href="boolean.html">BOOLEAN</a>

   is_normal: <a href="boolean.html">BOOLEAN</a>

   is_special: <a href="boolean.html">BOOLEAN</a>

   is_tuple: <a href="boolean.html">BOOLEAN</a>

   is_agent: <a href="boolean.html">BOOLEAN</a>

   is_living: <a href="boolean.html">BOOLEAN</a>
<em>      -- Is the type alive (i.e. can instances be created) ?
</em>

   is_actionable: <a href="boolean.html">BOOLEAN</a>
<em>      -- Does the type's base class inherit from PC_ACTIONABLE?
</em>

   has_invariant: <a href="boolean.html">BOOLEAN</a>
<em>      -- Does the type's base class define an invariant clause?
</em>

<strong>feature(s) from </strong><a href="in_type.html">IN_TYPE</a>
<em>   -- Instance sizes
</em>
   instance_size: <a href="integer.html">INTEGER</a>
<em>      -- Memory size (in bytes) of instances of the current type.
</em>

   boxed_size: <a href="integer.html">INTEGER</a>
<em>      -- Memory size of boxed expanded instances. 
</em>

   field_size: <a href="integer.html">INTEGER</a>
<em>      -- Memory size (in bytes) of objects within other objects.
</em>
      <strong>ensure</strong>
         not_negative: 0 <= Result;
         when_expanded: is_expanded implies Result = instance_size

   boxed_offset: <a href="integer.html">INTEGER</a>
<em>      -- Offset of unboxed item within boxed object.
</em>

<strong>feature(s) from </strong><a href="in_type.html">IN_TYPE</a>
<em>   -- Comparison
</em>
   less_by_name (other: <a href="in_type.html">IN_TYPE</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- Comparison by name.
</em>

   conformance (other: <a href="in_type.html">IN_TYPE</a>): <a href="integer.html">INTEGER</a>
<em>      -- How good does </em>Current<em> conform to </em>other<em>?
      -- </em>Result=0<em> means exact match, </em>Result=Maximum_integer<em> means no match,
      -- i.e. assignment like </em>other_obj:=current_obj<em> is not possible.
</em>
      <strong>require</strong>
         other_not_void: other /= Void
      <strong>ensure</strong>
         not_negative: Result >= 0

   conforms_to_type (other: <a href="in_type.html">IN_TYPE</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- Does type described by </em>Current<em> conform to type
      -- described by </em>other<em>?
</em>
      <strong>require</strong>
         not_void: other /= Void

   does_effect (other: <a href="in_type.html">IN_TYPE</a>): <a href="boolean.html">BOOLEAN</a>
<em>      -- Does type described by </em>Current<em> effect the type
      -- described by </em>other<em>?
</em>
      <strong>require</strong>
         not_void: other /= Void

<strong>feature(s) from </strong><a href="in_type.html">IN_TYPE</a>
<em>   -- Searching
</em>
   attribute_by_name (nm: <a href="string.html">STRING</a>): like attribute_at
<em>      -- </em>Current<em>s attribute with name </em>nm<em>
      -- </em>void<em> if no such attribute exists.
</em>
      <strong>require</strong>
         nm_not_void: nm /= Void
      <strong>ensure</strong>
         when_found: Result /= Void implies Result.has_name(nm) and then attributes.has(Result)

   constant_by_name (nm: <a href="string.html">STRING</a>): like constant_at
<em>      -- </em>Current<em>s constant attribute with name </em>nm<em>
      -- </em>void<em> if no such constant exists.
</em>
      <strong>require</strong>
         nm_not_void: nm /= Void
      <strong>ensure</strong>
         when_found: Result /= Void implies Result.has_name(nm) and then constants.has(Result)

   routine_by_name (nm: <a href="string.html">STRING</a>): like routine_at
<em>      -- routine in </em>Current<em>s class with name </em>nm<em>
      -- </em>void<em> if no such routine exists.
</em>
      <strong>require</strong>
         name_not_void: nm /= Void
      <strong>ensure</strong>
         when_found: Result /= Void implies Result.has_name(nm) and then routines.has(Result)

   push_type (t: <a href="in_type.html">IN_TYPE</a>)
      <strong>require</strong>
         not_void: t /= Void
      <strong>ensure</strong>
         type_stack_not_void: type_stack /= Void;
         stack_size: type_stack.count = old type_stack.count + 1

   top_type: <a href="in_type.html">IN_TYPE</a>
      <strong>ensure</strong>
         on_top: Result = type_stack.item(type_stack.count - 1);
         stack_size: type_stack.count = old type_stack.count

   pop_types (n: <a href="integer.html">INTEGER</a>)
<em>      -- Pop </em>n<em> types from the </em>type_stack<em>. 
</em>
      <strong>require</strong>
         not_negative: n >= 0
      <strong>ensure</strong>
         type_stack_size: type_stack.count = old type_stack.count - n

   routine_by_signature (res: <a href="intro_local.html">IN_LOCAL</a>; na: <a href="integer.html">INTEGER</a>; previous: like routine_at): like routine_at
<em>      -- Routine in </em>Current<em>s class with </em>na<em> argument types
      -- (which have been pushed previously to the type_stack) 
      -- and result type </em>res<em> (</em>Void<em> in case of a procedure).
      -- Search strats after </em>previous<em> (</em>Void<em> for the first call).
      -- Result is the next routine found
      -- (or </em>Void<em> if no more such routines). 
</em>
      <strong>require</strong>
         res_not_void: res /= Void;
         na_not_negative: na >= 0

<strong>feature(s) from </strong><a href="in_type.html">IN_TYPE</a>
<em>   -- Output
</em>
   append_indented (s: <a href="string.html">STRING</a>; indent, indent_increment: <a href="integer.html">INTEGER</a>)
<em>      -- Fill </em>s<em> by printable format of </em>Current<em> preceded by </em>indent<em>
      -- and closed by a new line character.
</em>
      <strong>require</strong>
         s_not_void: s /= Void;
         indent_not_negative: indent >= 0;
         increment_not_negative: indent_increment >= 0


<strong>invariant</strong>
   ident_not_negative: ident >= 0;
   base_class_not_void: base_class /= Void;
   instance_size_not_negative: instance_size >= 0;
   boxed_size_not_smaller_than_instance_size: boxed_size >= instance_size;

<strong>end of deferred <a href="in_type.html">IN_TYPE</a></strong></pre>
</body>
</html>