|
@@ -320,13 +320,17 @@ end;
|
|
function TWebIDLParser.ParseAttributes: TAttributeList;
|
|
function TWebIDLParser.ParseAttributes: TAttributeList;
|
|
|
|
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=TAttributeList.Create;
|
|
Result:=TAttributeList.Create;
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
ParseAttributes(Result,tkSquaredBraceClose);
|
|
ParseAttributes(Result,tkSquaredBraceClose);
|
|
- except
|
|
|
|
- FreeandNil(Result);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ FreeandNil(Result);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -335,8 +339,11 @@ function TWebIDLParser.ParseArgument(aParent : TIDLBaseObject): TIDLArgumentDefi
|
|
(* On Entry, we're on the argument start
|
|
(* On Entry, we're on the argument start
|
|
on exit, on the token after the argument definition i.e. a comma or ) *)
|
|
on exit, on the token after the argument definition i.e. a comma or ) *)
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=TIDLArgumentDefinition(Context.Add(aParent,TIDLArgumentDefinition,''));
|
|
Result:=TIDLArgumentDefinition(Context.Add(aParent,TIDLArgumentDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
if (CurrentToken=tkSquaredBraceOpen) then
|
|
if (CurrentToken=tkSquaredBraceOpen) then
|
|
begin
|
|
begin
|
|
@@ -356,9 +363,10 @@ begin
|
|
end;
|
|
end;
|
|
CheckCurrentTokens([tkIdentifier,tkOther]);
|
|
CheckCurrentTokens([tkIdentifier,tkOther]);
|
|
Result.Name:=CurrentTokenString;
|
|
Result.Name:=CurrentTokenString;
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -367,15 +375,19 @@ function TWebIDLParser.ParseFunction(aParent : TIDLBaseObject): TIDLFunctionDefi
|
|
(* On Entry, we're on the function identifier, on exit, on the final ) *)
|
|
(* On Entry, we're on the function identifier, on exit, on the final ) *)
|
|
|
|
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=TIDLFunctionDefinition(Context.Add(aParent,TIDLFunctionDefinition,CurrentTokenString));
|
|
Result:=TIDLFunctionDefinition(Context.Add(aParent,TIDLFunctionDefinition,CurrentTokenString));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
ExpectToken(tkEqual);
|
|
ExpectToken(tkEqual);
|
|
Result.ReturnType:=ParseType(Result,True,True);
|
|
Result.ReturnType:=ParseType(Result,True,True);
|
|
ParseArguments(Result.Arguments);
|
|
ParseArguments(Result.Arguments);
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -438,6 +450,7 @@ Const
|
|
Var
|
|
Var
|
|
Opts : TFunctionOptions;
|
|
Opts : TFunctionOptions;
|
|
FO : TFunctionOption;
|
|
FO : TFunctionOption;
|
|
|
|
+ ok: Boolean;
|
|
|
|
|
|
begin
|
|
begin
|
|
Opts:=[];
|
|
Opts:=[];
|
|
@@ -454,6 +467,7 @@ begin
|
|
GetToken;
|
|
GetToken;
|
|
end;
|
|
end;
|
|
Result:=TIDLFunctionDefinition(Context.Add(aParent,TIDLFunctionDefinition,''));
|
|
Result:=TIDLFunctionDefinition(Context.Add(aParent,TIDLFunctionDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
if (foConstructor in Opts) then
|
|
if (foConstructor in Opts) then
|
|
Result.Name:='New'
|
|
Result.Name:='New'
|
|
@@ -466,9 +480,10 @@ begin
|
|
end;
|
|
end;
|
|
ParseArguments(Result.Arguments);
|
|
ParseArguments(Result.Arguments);
|
|
Result.Options:=Result.Options+Opts;
|
|
Result.Options:=Result.Options+Opts;
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -499,13 +514,15 @@ function TWebIDLParser.ParseIterable(aParent: TIDLBaseObject): TIDLIterableDefin
|
|
|
|
|
|
Var
|
|
Var
|
|
T1,T2 : TIDLTypeDefDefinition;
|
|
T1,T2 : TIDLTypeDefDefinition;
|
|
|
|
+ ok: Boolean;
|
|
|
|
|
|
begin
|
|
begin
|
|
ExpectToken(tkLess);
|
|
ExpectToken(tkLess);
|
|
T1:=Nil;
|
|
T1:=Nil;
|
|
T2:=nil;
|
|
T2:=nil;
|
|
|
|
+ Result:=TIDLIterableDefinition(Context.Add(aParent,TIDLIterableDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
- Result:=TIDLIterableDefinition(Context.Add(aParent,TIDLIterableDefinition,''));
|
|
|
|
T1:=ParseType(Result,True,True);
|
|
T1:=ParseType(Result,True,True);
|
|
if (CurrentToken=tkComma) then
|
|
if (CurrentToken=tkComma) then
|
|
T2:=ParseType(Result,True,True);
|
|
T2:=ParseType(Result,True,True);
|
|
@@ -519,9 +536,10 @@ begin
|
|
Result.KeyType:=T1;
|
|
Result.KeyType:=T1;
|
|
end;
|
|
end;
|
|
T1:=nil;
|
|
T1:=nil;
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -530,6 +548,7 @@ function TWebIDLParser.CompleteSimpleType(tk: TIDLToken; Var S: UTF8String; out
|
|
|
|
|
|
begin
|
|
begin
|
|
Result:=tk;
|
|
Result:=tk;
|
|
|
|
+ IsNull:=false;
|
|
S:='';
|
|
S:='';
|
|
if (Result=tkUnsigned) then
|
|
if (Result=tkUnsigned) then
|
|
begin
|
|
begin
|
|
@@ -563,8 +582,11 @@ begin
|
|
end;
|
|
end;
|
|
|
|
|
|
function TWebIDLParser.ParseMapLikeMember(aParent: TIDLBaseObject): TIDLMaplikeDefinition;
|
|
function TWebIDLParser.ParseMapLikeMember(aParent: TIDLBaseObject): TIDLMaplikeDefinition;
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=TIDLMaplikeDefinition(Context.Add(aParent,TIDLMaplikeDefinition,''));
|
|
Result:=TIDLMaplikeDefinition(Context.Add(aParent,TIDLMaplikeDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.TypeName:='maplike';
|
|
Result.TypeName:='maplike';
|
|
ExpectToken(tkLess);
|
|
ExpectToken(tkLess);
|
|
@@ -572,32 +594,40 @@ begin
|
|
CheckCurrentToken(tkComma);
|
|
CheckCurrentToken(tkComma);
|
|
Result.ValueType:=ParseType(Result,True,true);
|
|
Result.ValueType:=ParseType(Result,True,true);
|
|
CheckCurrentToken(tkLarger);
|
|
CheckCurrentToken(tkLarger);
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
function TWebIDLParser.ParseSetLikeMember(aParent: TIDLBaseObject): TIDLSetlikeDefinition;
|
|
function TWebIDLParser.ParseSetLikeMember(aParent: TIDLBaseObject): TIDLSetlikeDefinition;
|
|
(* On Entry we're on setlike. On exit, we're on the > token *)
|
|
(* On Entry we're on setlike. On exit, we're on the > token *)
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=TIDLSetlikeDefinition(Context.Add(aParent,TIDLSetlikeDefinition,''));
|
|
Result:=TIDLSetlikeDefinition(Context.Add(aParent,TIDLSetlikeDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
ExpectToken(tkLess);
|
|
ExpectToken(tkLess);
|
|
Result.ElementType:=ParseType(Result);
|
|
Result.ElementType:=ParseType(Result);
|
|
Result.ElementType.Parent:=Result;
|
|
Result.ElementType.Parent:=Result;
|
|
CheckCurrentToken(tkLarger);
|
|
CheckCurrentToken(tkLarger);
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
function TWebIDLParser.ParseRecordTypeDef(aParent: TIDLBaseObject): TIDLRecordDefinition;
|
|
function TWebIDLParser.ParseRecordTypeDef(aParent: TIDLBaseObject): TIDLRecordDefinition;
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=TIDLRecordDefinition(Context.Add(aParent,TIDLRecordDefinition,''));
|
|
Result:=TIDLRecordDefinition(Context.Add(aParent,TIDLRecordDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.TypeName:='record';
|
|
Result.TypeName:='record';
|
|
ExpectToken(tkLess);
|
|
ExpectToken(tkLess);
|
|
@@ -605,9 +635,10 @@ begin
|
|
CheckCurrentToken(tkComma);
|
|
CheckCurrentToken(tkComma);
|
|
Result.ValueType:=ParseType(Result,True,true);
|
|
Result.ValueType:=ParseType(Result,True,true);
|
|
CheckCurrentToken(tkLarger);
|
|
CheckCurrentToken(tkLarger);
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -670,7 +701,7 @@ Const
|
|
|
|
|
|
Var
|
|
Var
|
|
S : UTF8String;
|
|
S : UTF8String;
|
|
- isNull : Boolean;
|
|
|
|
|
|
+ isNull , ok: Boolean;
|
|
tk : TIDLToken;
|
|
tk : TIDLToken;
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -682,15 +713,17 @@ begin
|
|
Tk:=CompleteSimpleType(tk,S,IsNull);
|
|
Tk:=CompleteSimpleType(tk,S,IsNull);
|
|
CheckCurrentToken(tkIdentifier);
|
|
CheckCurrentToken(tkIdentifier);
|
|
Result:=TIDLConstDefinition(Context.Add(aParent,TIDLConstDefinition,CurrentTokenString));
|
|
Result:=TIDLConstDefinition(Context.Add(aParent,TIDLConstDefinition,CurrentTokenString));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.TypeName:=S;
|
|
Result.TypeName:=S;
|
|
Result.AllowNull:=isNull;
|
|
Result.AllowNull:=isNull;
|
|
ExpectToken(tkEqual);
|
|
ExpectToken(tkEqual);
|
|
Result.ConstType:=ParseConstValue(S,false);
|
|
Result.ConstType:=ParseConstValue(S,false);
|
|
Result.Value:=S;
|
|
Result.Value:=S;
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -711,6 +744,7 @@ function TWebIDLParser.ParseAttribute(aParent : TIDLBaseObject): TIDLAttributeDe
|
|
*)
|
|
*)
|
|
Var
|
|
Var
|
|
Options : TAttributeOptions;
|
|
Options : TAttributeOptions;
|
|
|
|
+ ok: Boolean;
|
|
|
|
|
|
begin
|
|
begin
|
|
Options:=[];
|
|
Options:=[];
|
|
@@ -726,14 +760,16 @@ begin
|
|
end;
|
|
end;
|
|
CheckCurrentToken(tkAttribute);
|
|
CheckCurrentToken(tkAttribute);
|
|
Result:=TIDLAttributeDefinition(Context.Add(aParent,TIDLAttributeDefinition,''));
|
|
Result:=TIDLAttributeDefinition(Context.Add(aParent,TIDLAttributeDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.AttributeType:=ParseType(Result,True,True);
|
|
Result.AttributeType:=ParseType(Result,True,True);
|
|
CheckCurrentToken(tkIdentifier);
|
|
CheckCurrentToken(tkIdentifier);
|
|
Result.Name:=CurrentTokenString;
|
|
Result.Name:=CurrentTokenString;
|
|
Result.Options:=Options;
|
|
Result.Options:=Options;
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -766,6 +802,7 @@ function TWebIDLParser.ParseSerializer(aParent : TIDLBaseObject): TIDLSerializer
|
|
|
|
|
|
Var
|
|
Var
|
|
tk : TIDLToken;
|
|
tk : TIDLToken;
|
|
|
|
+ ok: Boolean;
|
|
|
|
|
|
begin
|
|
begin
|
|
Result:=Nil;
|
|
Result:=Nil;
|
|
@@ -773,6 +810,7 @@ begin
|
|
if tk=tkSemiColon then
|
|
if tk=tkSemiColon then
|
|
exit;
|
|
exit;
|
|
Result:=TIDLSerializerDefinition(Context.Add(aParent,TIDLSerializerDefinition,''));
|
|
Result:=TIDLSerializerDefinition(Context.Add(aParent,TIDLSerializerDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
if tk<>tkEqual then
|
|
if tk<>tkEqual then
|
|
begin
|
|
begin
|
|
@@ -797,9 +835,10 @@ begin
|
|
Result.Kind:=skSingle;
|
|
Result.Kind:=skSingle;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -812,7 +851,7 @@ Var
|
|
tk : TIDLToken;
|
|
tk : TIDLToken;
|
|
Attrs : TAttributeList;
|
|
Attrs : TAttributeList;
|
|
M : TIDLDefinition;
|
|
M : TIDLDefinition;
|
|
- isMixin,SemicolonSeen : Boolean;
|
|
|
|
|
|
+ isMixin,SemicolonSeen , ok: Boolean;
|
|
|
|
|
|
begin
|
|
begin
|
|
Attrs:=nil;
|
|
Attrs:=nil;
|
|
@@ -821,6 +860,7 @@ begin
|
|
if CurrentToken=tkMixin then
|
|
if CurrentToken=tkMixin then
|
|
ExpectToken(tkIdentifier);
|
|
ExpectToken(tkIdentifier);
|
|
Result:=TIDLInterfaceDefinition(Context.Add(aParent,TIDLInterfaceDefinition,CurrentTokenString));
|
|
Result:=TIDLInterfaceDefinition(Context.Add(aParent,TIDLInterfaceDefinition,CurrentTokenString));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.IsMixin:=IsMixin;
|
|
Result.IsMixin:=IsMixin;
|
|
tk:=GetToken;
|
|
tk:=GetToken;
|
|
@@ -830,6 +870,11 @@ begin
|
|
Result.ParentName:=CurrentTokenString;
|
|
Result.ParentName:=CurrentTokenString;
|
|
tk:=GetToken;
|
|
tk:=GetToken;
|
|
end;
|
|
end;
|
|
|
|
+ if CurrentToken=tkSemiColon then
|
|
|
|
+ begin
|
|
|
|
+ // empty interface
|
|
|
|
+ exit;
|
|
|
|
+ end;
|
|
CheckCurrentToken(tkCurlyBraceOpen);
|
|
CheckCurrentToken(tkCurlyBraceOpen);
|
|
tk:=GetToken;
|
|
tk:=GetToken;
|
|
While (tk<>tkCurlyBraceClose) do
|
|
While (tk<>tkCurlyBraceClose) do
|
|
@@ -896,10 +941,13 @@ begin
|
|
CheckCurrentToken(tkSemicolon);
|
|
CheckCurrentToken(tkSemicolon);
|
|
tk:=GetToken;
|
|
tk:=GetToken;
|
|
end;
|
|
end;
|
|
- except
|
|
|
|
- FreeAndNil(Attrs);
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ begin
|
|
|
|
+ FreeAndNil(Attrs);
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -968,7 +1016,7 @@ function TWebIDLParser.ParseDictionaryMember(aParent : TIDLBaseObject): TIDLDict
|
|
Var
|
|
Var
|
|
Attrs : TAttributeList;
|
|
Attrs : TAttributeList;
|
|
tk : TIDLToken;
|
|
tk : TIDLToken;
|
|
- isReq : Boolean;
|
|
|
|
|
|
+ isReq , ok: Boolean;
|
|
S : UTF8String;
|
|
S : UTF8String;
|
|
|
|
|
|
begin
|
|
begin
|
|
@@ -986,6 +1034,7 @@ begin
|
|
tk:=GetToken;
|
|
tk:=GetToken;
|
|
end;
|
|
end;
|
|
Result:=TIDLDictionaryMemberDefinition(Context.Add(aParent,TIDLDictionaryMemberDefinition,''));
|
|
Result:=TIDLDictionaryMemberDefinition(Context.Add(aParent,TIDLDictionaryMemberDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.Attributes:=Attrs;
|
|
Result.Attributes:=Attrs;
|
|
Result.IsRequired:=isReq;
|
|
Result.IsRequired:=isReq;
|
|
@@ -1001,9 +1050,10 @@ begin
|
|
tk:=GetToken;
|
|
tk:=GetToken;
|
|
end;
|
|
end;
|
|
CheckCurrentToken(tkSemicolon);
|
|
CheckCurrentToken(tkSemicolon);
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1042,17 +1092,21 @@ end;
|
|
function TWebIDLParser.ParseSequenceTypeDef(aParent : TIDLBaseObject): TIDLSequenceTypeDefDefinition;
|
|
function TWebIDLParser.ParseSequenceTypeDef(aParent : TIDLBaseObject): TIDLSequenceTypeDefDefinition;
|
|
(* On Entry we're on sequence. On exit, we're on the > token *)
|
|
(* On Entry we're on sequence. On exit, we're on the > token *)
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=TIDLSequenceTypeDefDefinition(Context.Add(aParent,TIDLSequenceTypeDefDefinition,''));
|
|
Result:=TIDLSequenceTypeDefDefinition(Context.Add(aParent,TIDLSequenceTypeDefDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.TypeName:='sequence';
|
|
Result.TypeName:='sequence';
|
|
ExpectToken(tkLess);
|
|
ExpectToken(tkLess);
|
|
Result.ElementType:=ParseType(Result);
|
|
Result.ElementType:=ParseType(Result);
|
|
Result.ElementType.Parent:=Result;
|
|
Result.ElementType.Parent:=Result;
|
|
CheckCurrentToken(tkLarger);
|
|
CheckCurrentToken(tkLarger);
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1064,10 +1118,12 @@ Var
|
|
D : TIDLTypeDefDefinition;
|
|
D : TIDLTypeDefDefinition;
|
|
tk : TIDLToken;
|
|
tk : TIDLToken;
|
|
Attr : TAttributeList;
|
|
Attr : TAttributeList;
|
|
|
|
+ ok: Boolean;
|
|
|
|
|
|
begin
|
|
begin
|
|
Attr:=Nil;
|
|
Attr:=Nil;
|
|
Result:=TIDLUnionTypeDefDefinition(Context.Add(aParent,TIDLUnionTypeDefDefinition,''));
|
|
Result:=TIDLUnionTypeDefDefinition(Context.Add(aParent,TIDLUnionTypeDefDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.TypeName:='union';
|
|
Result.TypeName:='union';
|
|
Repeat
|
|
Repeat
|
|
@@ -1086,26 +1142,33 @@ begin
|
|
CheckCurrentTokens([tkOr,tkBracketClose]);
|
|
CheckCurrentTokens([tkOr,tkBracketClose]);
|
|
tk:=CurrentToken;
|
|
tk:=CurrentToken;
|
|
until (tk=tkBracketClose);
|
|
until (tk=tkBracketClose);
|
|
- except
|
|
|
|
- FreeAndNil(Attr);
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ begin
|
|
|
|
+ FreeAndNil(Attr);
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
|
|
+ end;
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
function TWebIDLParser.ParsePromiseTypeDef(aParent: TIDLBaseObject): TIDLPromiseTypeDefDefinition;
|
|
function TWebIDLParser.ParsePromiseTypeDef(aParent: TIDLBaseObject): TIDLPromiseTypeDefDefinition;
|
|
(* On Entry we're on promise. On exit, we're on the > token *)
|
|
(* On Entry we're on promise. On exit, we're on the > token *)
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=TIDLPromiseTypeDefDefinition(Context.Add(aParent,TIDLPromiseTypeDefDefinition,''));
|
|
Result:=TIDLPromiseTypeDefDefinition(Context.Add(aParent,TIDLPromiseTypeDefDefinition,''));
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
Result.TypeName:='Promise';
|
|
Result.TypeName:='Promise';
|
|
ExpectToken(tkLess);
|
|
ExpectToken(tkLess);
|
|
Result.ReturnType:=ParseType(Result,True,true);
|
|
Result.ReturnType:=ParseType(Result,True,true);
|
|
CheckCurrentToken(tkLarger);
|
|
CheckCurrentToken(tkLarger);
|
|
- except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1129,7 +1192,7 @@ Const
|
|
ExtraTypeTokens = TypeTokens +[tkStringToken,tkVoid];
|
|
ExtraTypeTokens = TypeTokens +[tkStringToken,tkVoid];
|
|
|
|
|
|
Var
|
|
Var
|
|
- isNull : Boolean;
|
|
|
|
|
|
+ isNull , ok: Boolean;
|
|
typeName: UTF8String;
|
|
typeName: UTF8String;
|
|
Allowed : TIDLTokens;
|
|
Allowed : TIDLTokens;
|
|
tk : TIDLToken;
|
|
tk : TIDLToken;
|
|
@@ -1140,6 +1203,7 @@ begin
|
|
else
|
|
else
|
|
Allowed:=TypeTokens;
|
|
Allowed:=TypeTokens;
|
|
Result:=Nil;
|
|
Result:=Nil;
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
isNull:=False;
|
|
isNull:=False;
|
|
if FetchFirst then
|
|
if FetchFirst then
|
|
@@ -1176,9 +1240,10 @@ begin
|
|
end;
|
|
end;
|
|
if Assigned(Result) then
|
|
if Assigned(Result) then
|
|
Result.AllowNull:=isNull;
|
|
Result.AllowNull:=isNull;
|
|
- Except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1186,14 +1251,18 @@ function TWebIDLParser.ParseTypeDef(aParent : TIDLBaseObject): TIDLTypeDefDefini
|
|
(* On Entry we're on "typedef", "or" or "<" tokens. On exit, we're on the identifier *)
|
|
(* On Entry we're on "typedef", "or" or "<" tokens. On exit, we're on the identifier *)
|
|
|
|
|
|
|
|
|
|
|
|
+var
|
|
|
|
+ ok: Boolean;
|
|
begin
|
|
begin
|
|
Result:=ParseType(aParent);
|
|
Result:=ParseType(aParent);
|
|
|
|
+ ok:=false;
|
|
try
|
|
try
|
|
CheckCurrentToken(tkIdentifier);
|
|
CheckCurrentToken(tkIdentifier);
|
|
Result.Name:=CurrentTokenString;
|
|
Result.Name:=CurrentTokenString;
|
|
- Except
|
|
|
|
- MaybeFree(Result,aParent);
|
|
|
|
- Raise;
|
|
|
|
|
|
+ ok:=true;
|
|
|
|
+ finally
|
|
|
|
+ if not ok then
|
|
|
|
+ MaybeFree(Result,aParent);
|
|
end;
|
|
end;
|
|
end;
|
|
end;
|
|
|
|
|
|
@@ -1270,10 +1339,10 @@ begin
|
|
Result.Attributes:=Attrs;
|
|
Result.Attributes:=Attrs;
|
|
Attrs:=nil;
|
|
Attrs:=nil;
|
|
end;
|
|
end;
|
|
- except
|
|
|
|
|
|
+ finally
|
|
FreeAndNil(Attrs);
|
|
FreeAndNil(Attrs);
|
|
- Raise;
|
|
|
|
end;
|
|
end;
|
|
|
|
+ if CurrentToken=tkSemiColon then exit;
|
|
ExpectToken(tkSemicolon);
|
|
ExpectToken(tkSemicolon);
|
|
end;
|
|
end;
|
|
|
|
|