Browse Source

webidl: fixed keeping stacktrace on exception, fixed uninitializd var in ParseConst, gitignore linux test file, parse empty interface without brackets

mattias 3 years ago
parent
commit
bcdb68a8c4

+ 132 - 63
packages/webidl/src/webidlparser.pp

@@ -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;
 
 

+ 1 - 0
packages/webidl/src/webidltopas.pp

@@ -715,6 +715,7 @@ function TWebIDLToPas.WritePrivateReadOnlyField(aAttr: TIDLAttributeDefinition
 
 
 begin
 begin
   AddLn('%s%s : %s; external name ''%s''; ',[FieldPrefix,GetName(aAttr),GetTypeName(aAttr.AttributeType),aAttr.Name]);
   AddLn('%s%s : %s; external name ''%s''; ',[FieldPrefix,GetName(aAttr),GetTypeName(aAttr.AttributeType),aAttr.Name]);
+  Result:=true;
 end;
 end;
 
 
 function TWebIDLToPas.WriteField(aAttr: TIDLAttributeDefinition): Boolean;
 function TWebIDLToPas.WriteField(aAttr: TIDLAttributeDefinition): Boolean;

+ 2 - 0
packages/webidl/tests/.gitignore

@@ -0,0 +1,2 @@
+lib
+testidl

+ 19 - 3
packages/webidl/tests/tcidlparser.pp

@@ -100,8 +100,6 @@ Type
     Procedure TestRecord;
     Procedure TestRecord;
   end;
   end;
 
 
-  { TTestInterfaceParser }
-
   { TTestBaseInterfaceParser }
   { TTestBaseInterfaceParser }
 
 
   TTestBaseInterfaceParser = Class(TTestParser)
   TTestBaseInterfaceParser = Class(TTestParser)
@@ -116,9 +114,12 @@ Type
     Property CustAttributes : String Read FCustAttributes Write FCustAttributes;
     Property CustAttributes : String Read FCustAttributes Write FCustAttributes;
   end;
   end;
 
 
+  { TTestInterfaceParser }
+
   TTestInterfaceParser = Class(TTestBaseInterfaceParser)
   TTestInterfaceParser = Class(TTestBaseInterfaceParser)
   Published
   Published
     Procedure ParseEmpty;
     Procedure ParseEmpty;
+    Procedure ParseEmptyNoBrackets;
     Procedure ParseEmptyInheritance;
     Procedure ParseEmptyInheritance;
     Procedure ParseMixinEmpty;
     Procedure ParseMixinEmpty;
     Procedure ParseMixinEmptyInheritance;
     Procedure ParseMixinEmptyInheritance;
@@ -144,6 +145,7 @@ Type
     Procedure Parse;
     Procedure Parse;
     Procedure ParseReadOnly;
     Procedure ParseReadOnly;
   end;
   end;
+
   { TTestConstInterfaceParser }
   { TTestConstInterfaceParser }
 
 
   TTestConstInterfaceParser = Class(TTestBaseInterfaceParser)
   TTestConstInterfaceParser = Class(TTestBaseInterfaceParser)
@@ -415,7 +417,7 @@ end;
 function TTestOperationInterfaceParser.ParseFunction(ADef, aName,
 function TTestOperationInterfaceParser.ParseFunction(ADef, aName,
   aReturnType: UTF8String; aArguments: array of UTF8String): TIDLFunctionDefinition;
   aReturnType: UTF8String; aArguments: array of UTF8String): TIDLFunctionDefinition;
 Var
 Var
-  TN,Src : UTF8String;
+  TN: UTF8String;
   P,I,Idx : integer;
   P,I,Idx : integer;
   Arg : TIDLArgumentDefinition;
   Arg : TIDLArgumentDefinition;
   ID : TIDLInterfaceDefinition;
   ID : TIDLInterfaceDefinition;
@@ -1322,6 +1324,20 @@ begin
   ParseInterface('A','',[]);
   ParseInterface('A','',[]);
 end;
 end;
 
 
+procedure TTestInterfaceParser.ParseEmptyNoBrackets;
+var
+  d: TIDLInterfaceDefinition;
+begin
+  InitSource('interface A;'+sLineBreak);
+  Parser.Parse;
+  AssertEquals('Correct class',TIDLInterfaceDefinition,Definitions[0].ClassType);
+  d:=Definitions[0] as TIDLInterfaceDefinition;
+  AssertEquals('Name','A',d.Name);
+  AssertEquals('Inheritance : ','',d.ParentName);
+  AssertEquals('Member count',0,d.Members.Count);
+  AssertEquals('Mixin correct',false,d.IsMixin);
+end;
+
 procedure TTestInterfaceParser.ParseEmptyInheritance;
 procedure TTestInterfaceParser.ParseEmptyInheritance;
 begin
 begin
   ParseInterface('A','B',[]);
   ParseInterface('A','B',[]);

+ 2 - 2
packages/webidl/tests/tcidlscanner.pp

@@ -5,13 +5,13 @@ unit tcidlscanner;
 interface
 interface
 
 
 uses
 uses
-  Classes, SysUtils, fpcunit, testutils, testregistry, webidlscanner;
+  Classes, SysUtils, fpcunit, testregistry, webidlscanner;
 
 
 type
 type
 
 
   { TTestScanner }
   { TTestScanner }
 
 
-  TTestScanner= class(TTestCase)
+  TTestScanner = class(TTestCase)
   private
   private
     FScanner: TWebIDLScanner;
     FScanner: TWebIDLScanner;
     FVersion: TWEbIDLversion;
     FVersion: TWEbIDLversion;

+ 19 - 5
packages/webidl/tests/testidl.lpi

@@ -1,14 +1,18 @@
-r<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <CONFIG>
 <CONFIG>
   <ProjectOptions>
   <ProjectOptions>
-    <Version Value="11"/>
+    <Version Value="12"/>
     <General>
     <General>
+      <Flags>
+        <MainUnitHasCreateFormStatements Value="False"/>
+        <MainUnitHasTitleStatement Value="False"/>
+        <MainUnitHasScaledStatement Value="False"/>
+        <CompatibilityMode Value="True"/>
+      </Flags>
       <SessionStorage Value="InProjectDir"/>
       <SessionStorage Value="InProjectDir"/>
-      <MainUnit Value="0"/>
       <Title Value="testidl"/>
       <Title Value="testidl"/>
       <ResourceType Value="res"/>
       <ResourceType Value="res"/>
       <UseXPManifest Value="True"/>
       <UseXPManifest Value="True"/>
-      <Icon Value="0"/>
     </General>
     </General>
     <BuildModes Count="1">
     <BuildModes Count="1">
       <Item1 Name="Default" Default="True"/>
       <Item1 Name="Default" Default="True"/>
@@ -67,11 +71,21 @@ r<?xml version="1.0" encoding="UTF-8"?>
     </Target>
     </Target>
     <SearchPaths>
     <SearchPaths>
       <IncludeFiles Value="$(ProjOutDir)"/>
       <IncludeFiles Value="$(ProjOutDir)"/>
+      <OtherUnitFiles Value="../src"/>
       <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
       <UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
     </SearchPaths>
     </SearchPaths>
+    <CodeGeneration>
+      <Checks>
+        <IOChecks Value="True"/>
+        <RangeChecks Value="True"/>
+        <OverflowChecks Value="True"/>
+        <StackChecks Value="True"/>
+      </Checks>
+      <VerifyObjMethodCallValidity Value="True"/>
+    </CodeGeneration>
     <Linking>
     <Linking>
       <Debugging>
       <Debugging>
-        <UseHeaptrc Value="True"/>
+        <TrashVariables Value="True"/>
       </Debugging>
       </Debugging>
       <Options>
       <Options>
         <Win32>
         <Win32>

+ 3 - 3
utils/pas2js/webidl2pas.lpi

@@ -1,17 +1,18 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <CONFIG>
 <CONFIG>
   <ProjectOptions>
   <ProjectOptions>
-    <Version Value="11"/>
+    <Version Value="12"/>
     <General>
     <General>
       <Flags>
       <Flags>
         <SaveOnlyProjectUnits Value="True"/>
         <SaveOnlyProjectUnits Value="True"/>
         <MainUnitHasCreateFormStatements Value="False"/>
         <MainUnitHasCreateFormStatements Value="False"/>
+        <MainUnitHasTitleStatement Value="False"/>
         <MainUnitHasScaledStatement Value="False"/>
         <MainUnitHasScaledStatement Value="False"/>
         <SaveJumpHistory Value="False"/>
         <SaveJumpHistory Value="False"/>
         <SaveFoldState Value="False"/>
         <SaveFoldState Value="False"/>
+        <CompatibilityMode Value="True"/>
       </Flags>
       </Flags>
       <SessionStorage Value="InProjectDir"/>
       <SessionStorage Value="InProjectDir"/>
-      <MainUnit Value="0"/>
       <Title Value="WebIDL To Pascal converter Application"/>
       <Title Value="WebIDL To Pascal converter Application"/>
       <UseAppBundle Value="False"/>
       <UseAppBundle Value="False"/>
       <ResourceType Value="res"/>
       <ResourceType Value="res"/>
@@ -24,7 +25,6 @@
     </PublishOptions>
     </PublishOptions>
     <RunParams>
     <RunParams>
       <FormatVersion Value="2"/>
       <FormatVersion Value="2"/>
-      <Modes Count="0"/>
     </RunParams>
     </RunParams>
     <Units Count="1">
     <Units Count="1">
       <Unit0>
       <Unit0>