+ support for single character message names (patch by Dmitry Boyarintsev,

mantis #14680)

git-svn-id: branches/objc@13769 -
This commit is contained in:
Jonas Maebe 2009-09-28 09:43:34 +00:00
parent 3f0eee741a
commit 50f37ad445
3 changed files with 21 additions and 7 deletions

View File

@ -1385,16 +1385,18 @@ begin
Message(parser_e_ill_msg_param); Message(parser_e_ill_msg_param);
end; end;
pt:=comp_expr(true); pt:=comp_expr(true);
if pt.nodetype=stringconstn then { message is 1-character long }
if is_constcharnode(pt) then
begin
include(pd.procoptions,po_msgstr);
tprocdef(pd).messageinf.str:=stringdup(chr(byte(tordconstnode(pt).value.uvalue and $FF)));
end
else if pt.nodetype=stringconstn then
begin begin
include(pd.procoptions,po_msgstr); include(pd.procoptions,po_msgstr);
if (tstringconstnode(pt).len>255) then if (tstringconstnode(pt).len>255) then
Message(parser_e_message_string_too_long); Message(parser_e_message_string_too_long);
tprocdef(pd).messageinf.str:=stringdup(tstringconstnode(pt).value_str); tprocdef(pd).messageinf.str:=stringdup(tstringconstnode(pt).value_str);
{ check whether the selector name is valid in case of Objective-C }
if is_objc_class_or_protocol(tprocdef(pd)._class) and
not objcvalidselectorname(@tprocdef(pd).messageinf.str^[1],length(tprocdef(pd).messageinf.str^)) then
Message1(type_e_invalid_objc_selector_name,tprocdef(pd).messageinf.str^);
end end
else else
if is_constintnode(pt) and if is_constintnode(pt) and
@ -1409,6 +1411,11 @@ begin
end end
else else
Message(parser_e_ill_msg_expr); Message(parser_e_ill_msg_expr);
{ check whether the selector name is valid in case of Objective-C }
if (po_msgstr in pd.procoptions) and
is_objc_class_or_protocol(tprocdef(pd)._class) and
not objcvalidselectorname(@tprocdef(pd).messageinf.str^[1],length(tprocdef(pd).messageinf.str^)) then
Message1(type_e_invalid_objc_selector_name,tprocdef(pd).messageinf.str^);
pt.free; pt.free;
end; end;

View File

@ -1,3 +1,5 @@
{ %norun }
{ This is just a small file used to verify the alignment of different { This is just a small file used to verify the alignment of different
structures. Only the assembler output should be checked. structures. Only the assembler output should be checked.
} }
@ -13,6 +15,7 @@ type
tmyotherclass = class(tmyclass) tmyotherclass = class(tmyclass)
public public
procedure tito(var Msg); message 'hello'; procedure tito(var Msg); message 'hello';
procedure tita(var Msg); message 'h';
procedure titi(var Msg); message 12; procedure titi(var Msg); message 12;
published published
procedure published_method; procedure published_method;
@ -22,6 +25,10 @@ type
begin begin
end; end;
procedure tmyotherclass.tita(var Msg);
begin
end;
procedure tmyotherclass.titi(var Msg); procedure tmyotherclass.titi(var Msg);
begin begin
end; end;

View File

@ -8,7 +8,7 @@ program protocoltest;
type type
MyProtocolA = objcprotocol MyProtocolA = objcprotocol
function newMethod: longint; message 'newMethod'; function newMethod: longint; message 'n';
end; end;
MyProtocolB = objcprotocol(MyProtocolA) MyProtocolB = objcprotocol(MyProtocolA)
@ -24,7 +24,7 @@ type
end; end;
TMyObjectB = objcclass(NSObject,MyProtocolA) TMyObjectB = objcclass(NSObject,MyProtocolA)
function newMethod: longint; message 'newMethod'; function newMethod: longint; message 'n';
class function newClassMethod: longint; message 'newClassMethod'; class function newClassMethod: longint; message 'newClassMethod';
end; end;