Commit Graph

33363 Commits

Author SHA1 Message Date
svenbarth
963a4d7b23 Commit of a completely restructured helper implementation. Instead of changing objectdefs with odt_classhelper to odt_class, they'll have the odt_helper type assigned to and this will be kept. This also implies that the parent of a helper is its true parent while the extended type is set to a field in tobjectdef (extendeddef).
This change became necessary of the following reasons:
- Records don't support inheritance, thus for "record helpers" some creativity would have been necessary to implement them; with the new implementation this is more easily
- the new approach allows for easy checks regarding virtual methods and their overrides which would have been more complicated in the old variant
- if someone feels the need the types of helpers (object, interface) can be added rather easily
- unnecessary things like VMT generation can be disabled now

details:
- msg*: 
* moved some messages from parser to type
* adjusted a message ("class helper" => "helper")
- symdef.pas:
* renamed "helperparent" to "extendeddef" and changed its type from "tobjectdef" to "tabstractrecorddef", so records can be extended as well (somewhen in the near future)
* removed "finish_class_helper" method as it isn't necessary (luckily I haven't yet adjusted the ObjC variant)
* changed name of "is_objectpascal_classhelper" to "is_objectpascal_helper" to reflect that this function applies to all helper types
* tobjectdef.create: ImplementedInterfaces isn't created for odt_helper anymore
* tobjectdef.alignment: for helpers it's the same as for classes although this shouldn't be used anywhere...
* tobjectdef.vmtmethodoffset: set to 0 for helpers to be sure...
* tobjectdef.needs_inittable: not needed for helpers (no fields allowed)
* is_objectpascal_helper: only needs check for "odt_helper" object type
- symconst.pas:
* changed odt_classhelper to more general odt_helper
* added new type "thelpertype" which is used to check that "(record|class) helper" corresponds with the given extended type (as Delphi XE checks this as well this strict solution can be kept for modes Delphi and ObjFPC)
- symtable.pas:
* extended "searchsym_in_class" with the possibility to disable the search for helper methods (needed for inherited) => this implies changing all occurences of "searchsym_in_class" with a "true" except some special locations
* renamed "search_objectpascal_classhelper" to "search_objectpascal_helper"
* searchsym_in_class: 
** when an extended method is defined with "overload" it can be that a same named method of the extended class might be called (sadly this means that this search was unnecessary...)
** contextclassh is the def of the helper in the case of an inherited call inside the helper's implementation
** when methods inside a helper are searched, it must be searched in the extended type first
- ptype.pas:
* single_type is used to parse the parent of a helper as well, so allow a helper if the stoParseClassParent is given (needs check in pdecobj.pas/parse_class_parents for normal classes)
* read_named_type: currently the only case when something <> ht_none is passed to the modified parse_objdec (see below) is when the combination "class helper" is encountered ("record helper" will be another one)
- pinline.pas: adjustment for extended "searchsym_in_class"
- pexpr.pas:
* adjustments regarding "searchsym_in_class" and "is_objectpascal_helper"
* factor/factor_read_id: moved the check for "TSomeClassType.SomeMethod" outside of the "is_class" check
* factor: 
** in case of an inherited we need to search inside the extended type first (Note: this needs to be extended to find methods in the helper parent if no method is found in the extended type)
** we also need to disable the search for helper methods when searching for an inherited method (Note: it might be better to introduce a enum to decide whether a helper method should search before or after the methods of the extended type or even never)
- pdecsub.pas:
* insert_self_and_vmt_para: in a helper the type of Self is of the extended type
* pd_abstract, pd_final: more nice error message
* pd_override, pd_message, pd_reintroduce: adjusted checks because now "is_class" is no longer true for helpers
* proc_direcdata: allowed "abstract" for helpers (only to produce a more nice error message)
* parse_proc_direc: adjustment because of "is_objectpascal_helper"
- pdecobj.pas:
* adjustments regarding "is_objectpascal_helper"
* adjusted object_dec to take the type of the helper (class, record) as a parameter to be able to check whether the correct extended type was given
* struct_property_dec: properties are allowed in helpers
* parse_object_options: nothing to be parsed for helpers (at least I hope so ^^)
* parse_parent_classes: 
** the parent of a helper is now parsed as a normal parent, the extended type is parsed in an extra procedure
** check for "sealed" no longer needed
** added check that the parsed parent of a helper is indeed a helper
** allow to parse the closing ")" of the helper's parent
* parse_extended_class:
** new procedure that parses the type which is extended
** it checks that the extended type is a class for "class helper" and a record for "record helper"
** it checks that a helper extends the same class or a subclass for class helpers
** it checks that a helper extends the same record for record helpers
* parse_object_members:
** "type", "const", "var" is allowed in helpers
** don't exclude flags regarding virtual methods, they are needed for the checks in mode Delphi (this implies that VMT loading must be disabled for helpers)
* object_dec:
** don't change "odt_helper" to "odt_class", but still include the "oo_is_classhelper" flag
** allow the parsing of object options (there are none)
** parse the extended type for helpers
- pdecl.pas
* adjustment because of extension of object_dec
* types_dec: remove the call to finish_classhelper
- objcdef.pas
* objcaddencodedtype, objcdochecktype: add references to helpers as implicit pointers although that should not be used in any way...
- nld.pas
* tloadnode.pass_typecheck: self is a reference to the extended type
- nflw.pas
* create_for_in_loop: adjustment because of changed procedure and inheritance type
- ncgrtti.pas
* TRTTIWriter.write_rtti_data: disable for helpers for now (I need to check what Delphi does here)
- ncgld.pas
* tcgloadnode.pass_generate_code: virtual methods of helpers are treated as normal methods
- ncgcal.pas
* tcgcallnode.pass_generate_code: virtual methods of helpers are treated as normal methods
- ncal.pas
* tcallnode.pass_typecheck: adjust for extension of tcallcandidates constructor
- htypechk.pas
* tcallcandidates declaration: extend some methods to (dis)allow the search for helper methods (needed for inherited)
* tcallcandidates.collect_overloads_in_struct: 
** search first in helpers for methods and stop if none carries the "overload" flag
** move the addition of the procsyms to an extra nested procedure because it's used for helper methods and normal struct methods

git-svn-id: branches/svenbarth/classhelpers@16947 -
2011-02-20 11:41:55 +00:00
svenbarth
d12b198c7f Rebase to revision 16888
git-svn-id: branches/svenbarth/classhelpers@16891 -
2011-02-07 20:30:48 +00:00
svenbarth
9b6fbd330c tchlp37.pp: properties seem to be disliked by Delphi 2007 (when accessing them), so test using a function
tchlp50.pp+: added some more tests that yet need to be verified in Delphi

git-svn-id: branches/svenbarth/classhelpers@16890 -
2011-02-07 19:00:13 +00:00
svenbarth
7cc7826343 - msg*: found a message to reuse
- pdecobj.pas: removed a check whether a class (helper) tries to inherit from a class helper, because now single_type handles this
- pexpr.pas: 
* prohibit type casts to class helpers (note: this might be needed for ObjC categories as well)
* class helper references may only be used when inheriting from them (needs to be checked for ObjC categories as well)
- ptype.pas:
* single_type: extend check against categories for class helpers
* read_named_type: extend check against categories for class helpers
- symbase.pas: add a method that adds symbol table flags recursivly to a stack of symtables (it stops updating the symtables once a symtable already has that flag or it's a global-/staticsymtable)
- symdef.pas: adjusted the constructor of tobjectdef to use the new method for adding flags 

git-svn-id: branches/svenbarth/classhelpers@16889 -
2011-02-07 18:59:09 +00:00
svenbarth
e19bcfae38 Added a flag set to TSymtable that tells whether it contains a class helper symbol, which is currently only used for static- and globalsymtables.
symconst.pas: added new enum tsymtableoption with set tsymtableoptions; currently it contains only sto_has_classhelper, but refactoring tstoredsymtable.b_needs_init_final is on the todo list
ppu.pas: added a new entry type that will hold the symtable options (91)
symbase.pas: added a new field "tableoptions" to TSymtable which will hold the flags of the symtable (only saved by tstoredsymtable)
symdef.pas: when a tobjectdef is created as a odt_classhelper or odt_objccategory the flag sto_has_classhelper is added to its owning global- or staticsymtable
symtable.pas: 
* load and write the symtable's options as a small set to an entry before the definition entries
* tabstractlocalsymtable needed to annoy me by not calling "inherited writeppu" which does the same as tabstractsymtable did before
* search_last_objectpascal_classhelper: check whether the static- or globalsymtable contains a class helper at all; if not then just continue with the next
utils/ppudump.pas:
* added reading of symtableoptions entry (as readsymtableoptions) based on the reading of tsym options
* added the reading of symtableoptions before every read of the contents of a TSymtable (definitions, symbols)

git-svn-id: branches/svenbarth/classhelpers@16845 -
2011-01-30 09:19:59 +00:00
svenbarth
bc2db220be tchlp45: corrected the test; it used a non existing method instead of the private one, but this doesn't make a difference in the result (it still fails as it should ^^)
git-svn-id: branches/svenbarth/classhelpers@16844 -
2011-01-30 09:05:33 +00:00
svenbarth
a7d99a5561 Increased PPU version again so it differs from that in trunk
git-svn-id: branches/svenbarth/classhelpers@16834 -
2011-01-29 10:23:43 +00:00
svenbarth
07eebff55c Rebase to revision 16827
adjusted nflw.pas to compile again

git-svn-id: branches/svenbarth/classhelpers@16831 -
2011-01-28 22:15:34 +00:00
svenbarth
b74e0e9b4e Added another bunch of tests. Partly they still need to be verified in Delphi.
git-svn-id: branches/svenbarth/classhelpers@16830 -
2011-01-28 21:09:33 +00:00
svenbarth
a317827456 symtable.pas:
- moved "find_last_classhelper" out of "search_objectpascal_class_helper" so that it can be used in the "for ... in" code.
- renamed "find_last_classhelper" to "search_last_objectpascal_classhelper"
- fixed the unintentional use of a parameter ("srsymtable") of the parent function (it was intended as a variable from the beginning)
- "search_objectpascal_class_helper" now also checks whether the matched class helper method is visible; for this a new parameter for the contextclass was added which is passed when called from "searchsym_in_class"
nflw.pas: before checking for a "GetEnumerator" method in the class we now check whether one of the class helpers in the hierarchy that is available for that class (using "search_last_objectpascal_classhelper") implements such a method (I need yet to check whether Delphi supports the addition of "Current" and "MoveNext" as well)

git-svn-id: branches/svenbarth/classhelpers@16829 -
2011-01-28 21:05:29 +00:00
svenbarth
36ee46110c Updated ppudump to support the new ppu data that might contain class helpers.
This needed a small restructuring of the code as we need to know the object_options (especially oo_is_classhelper) when we reach the point in the ppu where the parent class helper is stored.

git-svn-id: branches/svenbarth/classhelpers@16828 -
2011-01-28 20:57:19 +00:00
nickysn
c96b89adce * GAS no longer required to build hermes on i386
git-svn-id: trunk@16827 -
2011-01-28 20:06:00 +00:00
marco
6d0e9444cd * patch from #18613 from M. Kamburelis fixes glBufferSubDataARB and some formatting.
git-svn-id: trunk@16826 -
2011-01-28 12:01:54 +00:00
joost
012ef5218b * Fixed mem-leak, FContentProducers was re-initialized during the inherited destroy
git-svn-id: trunk@16825 -
2011-01-28 10:55:35 +00:00
joost
9191eb35a9 * Fixed mem-leak
git-svn-id: trunk@16824 -
2011-01-28 09:06:46 +00:00
paul
27bb39a1ca compiler: comment tblock_type members
git-svn-id: trunk@16823 -
2011-01-28 06:54:38 +00:00
marco
a14b0d020e * Patch from #18617 Forkevent from Seth Grover.
git-svn-id: trunk@16822 -
2011-01-27 19:15:10 +00:00
sekelsenmat
1b8372d750 Improves the DXF reader
git-svn-id: trunk@16820 -
2011-01-26 16:06:19 +00:00
Jonas Maebe
04e26bfc85 * corrected version of r16812: code generation is still handled specially
for assigned(), but the type information is now correct so it doesn't
    have to be forced to OS_ADDR anymore

git-svn-id: trunk@16819 -
2011-01-26 14:50:18 +00:00
paul
0f35da07f1 compiler: call gen_intf_wrappers not only for unit symtables but also for syntables of records and object types because they can contain nested classes (bug #0018610)
git-svn-id: trunk@16818 -
2011-01-26 13:50:36 +00:00
sekelsenmat
6bad2fa169 Large improvements to the DXF reader and adds a new circle entity to fpvectorial
git-svn-id: trunk@16816 -
2011-01-26 09:11:53 +00:00
Jonas Maebe
ed1485c33e - reverted r16812 for now because it breaks building some packages
git-svn-id: trunk@16815 -
2011-01-25 21:46:25 +00:00
Jonas Maebe
b0f3fd2533 * completely handle assigned() in pass_1, replaced second_assigned with
internalerror

git-svn-id: trunk@16812 -
2011-01-25 08:01:14 +00:00
sergei
2b6fea065d * Several functions had their results unassigned, fixed.
git-svn-id: trunk@16811 -
2011-01-25 07:32:39 +00:00
sergei
58f37dc952 Improvements to dispinterface property handling:
* Create implicit access methods, which hold type information for property parameters and allow parsing/typechecking occur the same way as for regular (non-dispinterface) properties.
+ Introduce separate proctypeoptions for property access methods. They are translated into correct dispatch call types and used to distinguish property access from regular method calls.
* Bump PPU version because new information has been introduced.
- Code specific to dispinterface properties in expression parser is no longer necessary, removed.
* Allow access to default property with [] for dispinterfaces.
+ Extended the test with basic correctness checks for property dispatching.

git-svn-id: trunk@16810 -
2011-01-24 20:30:48 +00:00
sergei
ba74d47081 * pdecvar.pas, refactoring: don't create storedprocdef unless it is actually required.
+ Added statement to dispose storedprocdef after use, it was missing.

git-svn-id: trunk@16809 -
2011-01-24 17:15:51 +00:00
paul
ae7bfbb578 compiler: don't connect parasyms to procdefinition in tcallnode.derefimpl if procdefinition is not defined (a possible case for a generic method) (fixes issue #0018573)
git-svn-id: trunk@16808 -
2011-01-24 06:42:47 +00:00
paul
a39733a0a2 compiler: extend enumerator support for records:
- search GetEnumerator method in records too (while searching a enumerator for structure)
  - allow enumerator operator return type to be a record
  - copy/adapt enumerator helpers from tobjectdef to tabstractrecorddef
  + test

git-svn-id: trunk@16807 -
2011-01-24 04:13:28 +00:00
paul
8102c480d7 compiler: generate an error message if enumerator operator is declared with return object which has no valid MoveNext method, Current property
git-svn-id: trunk@16806 -
2011-01-24 03:08:22 +00:00
paul
9499692eeb compiler: allow Assignment and Explicit operators for undefined defs (issue #0018567)
git-svn-id: trunk@16805 -
2011-01-24 03:06:27 +00:00
marco
c24997777f patch from #18541 add comments field
git-svn-id: trunk@16804 -
2011-01-23 17:54:58 +00:00
sergei
124487b9b2 * xmlcfg.pp, changed 'exit' to 'break' so that function won't exit without result assigned, Mantis #18589
git-svn-id: trunk@16803 -
2011-01-23 15:52:47 +00:00
florian
af020e8ebc * fix assembling of ljmp mem, resolves #18556
git-svn-id: trunk@16802 -
2011-01-23 12:18:14 +00:00
florian
0be59445f8 + basic i386-embedded implementation for multiboot by Jeppe Johansen, resolves #15676
git-svn-id: trunk@16801 -
2011-01-23 11:18:50 +00:00
florian
197049c221 * updated to version 9
git-svn-id: trunk@16800 -
2011-01-23 11:01:37 +00:00
marco
ba4cb62544 * adapted FFTW licensing. This is a GPL lib, not MIT.
It is _made_ by MIT, and commercially marketed by MIT, it is not MIT _licensed_

git-svn-id: trunk@16798 -
2011-01-21 15:07:44 +00:00
paul
11e4440475 test: add delphi generic test which checks that both generic and regular type declarations with the same identifier are allowed in a unit
git-svn-id: trunk@16797 -
2011-01-21 03:39:21 +00:00
paul
0be10ee19f compiler: fix comments
git-svn-id: trunk@16796 -
2011-01-21 02:21:15 +00:00
svenbarth
3b4eae7d23 Updated some test cases (especially with OK statements to see the results when they are run by themselves).
git-svn-id: branches/svenbarth/classhelpers@16795 -
2011-01-19 19:54:57 +00:00
svenbarth
dde7290439 compiler/symtable.pas:
Add function to search for class helper symbols. This is completely different from the ObjC one (Note to self: rename that function), because in Delphi only one class helper can be in scope at a given time. Also class helper symbols are searched BEFORE the symbols of the class.

So the search works like this:
1) search the last available class helper for the given class 
2) search for the given symbol (method/property) in the found class helper (if any)
3) if not found then use the helper parent of the class helper and continue with (2)

Especially step 1 might easily lead to longer compile times if no class helper for a class is in scope, but many units are included. I'll need to test this by cycling the compiler with and without that search and will then decided whether I should think about something better.

Note: Overloaded methods are not yet supported.

git-svn-id: branches/svenbarth/classhelpers@16794 -
2011-01-19 19:53:32 +00:00
svenbarth
433851ab36 - compiler/pdecsub.pas:
* added flag pd_nothelper which tells the "directive parser" not to use this directive with class helpers
* added pd_nothelper flag to definitely forbidden directive (I'm not so happy about "abstract" though, as the error message because of this isn't very descriptive, because abstract is treated as field)
* some directives that are useless in class helpers are forbidden in mode ObjFPC only (e.g. "message", "virtual", "override")
- compiler/pdecobj.pas: as class helpers don't support some concepts used in normal classes (e.g. virtual methods) they are simply ignored and thus the corresponding flags are removed (this is for mode Delphi)

git-svn-id: branches/svenbarth/classhelpers@16793 -
2011-01-19 19:46:35 +00:00
svenbarth
d4be11cb42 Implement advanced class helper syntax which allows "inheritance" of class helpers. This is not the same as normal class inheritance as its only used to extend the scope to other class helpers (that pseudo heritage line) when searching for a symbol. The real parent is always the extended class.
- compiler/symdef.pas: add "helperparent" which contains the class helper the current class helper "inherits" from (its real parent is the extended class); it's saved to ppu as well
- compiler/ppu.pas: increase ppu version
- compiler/pdecobj.pas: 
* parse the "parent" of a class helper before parsing the extended class (the real parent)
* also disallow to inherit from class helpers for normal class (and to extend class helpers for class helpers)
* disallow the declarations of fields
* disallow the use of destructors
* don't parse abstract/sealed for class helpers
- compiler/ptyp.pas: _FOR is now parsed inside pdecobj.pas
- compiler/msg*: 
* extended some messages for class helpers
* added some class helper related messages (perhaps the one or other will vanish again...)

git-svn-id: branches/svenbarth/classhelpers@16792 -
2011-01-19 19:39:47 +00:00
Jonas Maebe
9a6f574f06 * removed (already unused, because of never taken branch) handling of
interfacecom in subscriptnodes, because a COM interface cannot have fields
    -> replaced with check (that actually is performed) to give an
    internalerror() should a reference-counted class type be subscripted

git-svn-id: trunk@16786 -
2011-01-19 14:50:17 +00:00
marco
88fe11958b * one letter type fixed, reported by Vincent
git-svn-id: trunk@16783 -
2011-01-19 11:37:17 +00:00
marco
ee3004a350 * moved an \end{description} so that the user manual compiles again.
git-svn-id: trunk@16782 -
2011-01-19 10:59:49 +00:00
paul
731291aee0 compiler: change Addr function to return untyped pointer by Blaise Thorn (issue #0018512), change/add tests
git-svn-id: trunk@16777 -
2011-01-18 15:23:58 +00:00
michael
774978a687 * Minor code cleanup suggested by LacaK <lacak@zoznam.sk>
git-svn-id: trunk@16776 -
2011-01-18 09:31:49 +00:00
michael
ae380229b6 * Applied patch from bug #16493
git-svn-id: trunk@16775 -
2011-01-18 08:36:09 +00:00
marco
49ed563e1d * procedural encode/decode base64. Useful when base64ing hashes to XMLs etc.
git-svn-id: trunk@16772 -
2011-01-16 12:09:35 +00:00
marco
608498c64c * committed the fpc/ hierarchy parts of the patch in mants 18271:
Adding clocale to Solaris.

git-svn-id: trunk@16771 -
2011-01-16 10:37:02 +00:00