|
@@ -1043,7 +1043,8 @@ implementation
|
|
typedconstswritable: boolean;
|
|
typedconstswritable: boolean;
|
|
object_member_blocktype : tblock_type;
|
|
object_member_blocktype : tblock_type;
|
|
hadgeneric,
|
|
hadgeneric,
|
|
- fields_allowed, is_classdef, class_fields, is_final, final_fields: boolean;
|
|
|
|
|
|
+ fields_allowed, is_classdef, class_fields, is_final, final_fields,
|
|
|
|
+ threadvar_fields : boolean;
|
|
vdoptions: tvar_dec_options;
|
|
vdoptions: tvar_dec_options;
|
|
fieldlist: tfpobjectlist;
|
|
fieldlist: tfpobjectlist;
|
|
|
|
|
|
@@ -1059,18 +1060,22 @@ implementation
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
|
|
- procedure parse_var;
|
|
|
|
|
|
+ procedure parse_var(isthreadvar:boolean);
|
|
begin
|
|
begin
|
|
if not(current_objectdef.objecttype in [odt_class,odt_object,odt_helper,odt_javaclass]) and
|
|
if not(current_objectdef.objecttype in [odt_class,odt_object,odt_helper,odt_javaclass]) and
|
|
{ Java interfaces can contain static final class vars }
|
|
{ Java interfaces can contain static final class vars }
|
|
not((current_objectdef.objecttype=odt_interfacejava) and
|
|
not((current_objectdef.objecttype=odt_interfacejava) and
|
|
is_final and is_classdef) then
|
|
is_final and is_classdef) then
|
|
Message(parser_e_type_var_const_only_in_records_and_classes);
|
|
Message(parser_e_type_var_const_only_in_records_and_classes);
|
|
- consume(_VAR);
|
|
|
|
|
|
+ if isthreadvar then
|
|
|
|
+ consume(_THREADVAR)
|
|
|
|
+ else
|
|
|
|
+ consume(_VAR);
|
|
fields_allowed:=true;
|
|
fields_allowed:=true;
|
|
object_member_blocktype:=bt_general;
|
|
object_member_blocktype:=bt_general;
|
|
class_fields:=is_classdef;
|
|
class_fields:=is_classdef;
|
|
final_fields:=is_final;
|
|
final_fields:=is_final;
|
|
|
|
+ threadvar_fields:=isthreadvar;
|
|
is_classdef:=false;
|
|
is_classdef:=false;
|
|
is_final:=false;
|
|
is_final:=false;
|
|
end;
|
|
end;
|
|
@@ -1083,7 +1088,7 @@ implementation
|
|
consume(_CLASS);
|
|
consume(_CLASS);
|
|
{ class modifier is only allowed for procedures, functions, }
|
|
{ class modifier is only allowed for procedures, functions, }
|
|
{ constructors, destructors, fields and properties }
|
|
{ constructors, destructors, fields and properties }
|
|
- if not((token in [_FUNCTION,_PROCEDURE,_PROPERTY,_VAR,_DESTRUCTOR]) or (token=_CONSTRUCTOR)) then
|
|
|
|
|
|
+ if not((token in [_FUNCTION,_PROCEDURE,_PROPERTY,_VAR,_DESTRUCTOR,_THREADVAR]) or (token=_CONSTRUCTOR)) then
|
|
Message(parser_e_procedure_or_function_expected);
|
|
Message(parser_e_procedure_or_function_expected);
|
|
|
|
|
|
{ Java interfaces can contain final class vars }
|
|
{ Java interfaces can contain final class vars }
|
|
@@ -1117,6 +1122,7 @@ implementation
|
|
fields_allowed:=true;
|
|
fields_allowed:=true;
|
|
is_classdef:=false;
|
|
is_classdef:=false;
|
|
class_fields:=false;
|
|
class_fields:=false;
|
|
|
|
+ threadvar_fields:=false;
|
|
is_final:=false;
|
|
is_final:=false;
|
|
object_member_blocktype:=bt_general;
|
|
object_member_blocktype:=bt_general;
|
|
end;
|
|
end;
|
|
@@ -1139,6 +1145,7 @@ implementation
|
|
is_final:=false;
|
|
is_final:=false;
|
|
final_fields:=false;
|
|
final_fields:=false;
|
|
hadgeneric:=false;
|
|
hadgeneric:=false;
|
|
|
|
+ threadvar_fields:=false;
|
|
object_member_blocktype:=bt_general;
|
|
object_member_blocktype:=bt_general;
|
|
fieldlist:=tfpobjectlist.create(false);
|
|
fieldlist:=tfpobjectlist.create(false);
|
|
repeat
|
|
repeat
|
|
@@ -1152,12 +1159,22 @@ implementation
|
|
end;
|
|
end;
|
|
_VAR :
|
|
_VAR :
|
|
begin
|
|
begin
|
|
- parse_var;
|
|
|
|
|
|
+ parse_var(false);
|
|
end;
|
|
end;
|
|
_CONST:
|
|
_CONST:
|
|
begin
|
|
begin
|
|
parse_const
|
|
parse_const
|
|
end;
|
|
end;
|
|
|
|
+ _THREADVAR :
|
|
|
|
+ begin
|
|
|
|
+ if not is_classdef then
|
|
|
|
+ begin
|
|
|
|
+ Message(parser_e_threadvar_must_be_class);
|
|
|
|
+ { for error recovery we enforce class fields }
|
|
|
|
+ is_classdef:=true;
|
|
|
|
+ end;
|
|
|
|
+ parse_var(true);
|
|
|
|
+ end;
|
|
_ID :
|
|
_ID :
|
|
begin
|
|
begin
|
|
if is_objcprotocol(current_structdef) and
|
|
if is_objcprotocol(current_structdef) and
|
|
@@ -1215,6 +1232,7 @@ implementation
|
|
fields_allowed:=true;
|
|
fields_allowed:=true;
|
|
is_classdef:=false;
|
|
is_classdef:=false;
|
|
class_fields:=false;
|
|
class_fields:=false;
|
|
|
|
+ threadvar_fields:=false;
|
|
is_final:=false;
|
|
is_final:=false;
|
|
final_fields:=false;
|
|
final_fields:=false;
|
|
object_member_blocktype:=bt_general;
|
|
object_member_blocktype:=bt_general;
|
|
@@ -1277,6 +1295,8 @@ implementation
|
|
include(vdoptions,vd_canreorder);
|
|
include(vdoptions,vd_canreorder);
|
|
if final_fields then
|
|
if final_fields then
|
|
include(vdoptions,vd_final);
|
|
include(vdoptions,vd_final);
|
|
|
|
+ if threadvar_fields then
|
|
|
|
+ include(vdoptions,vd_threadvar);
|
|
read_record_fields(vdoptions,fieldlist,nil,hadgeneric);
|
|
read_record_fields(vdoptions,fieldlist,nil,hadgeneric);
|
|
end;
|
|
end;
|
|
end
|
|
end
|