Browse Source

* Long long with enforcerange

Michaël Van Canneyt 1 year ago
parent
commit
02c4ac974a
2 changed files with 32 additions and 6 deletions
  1. 13 5
      packages/webidl/src/webidlparser.pp
  2. 19 1
      packages/webidl/tests/tcidlparser.pp

+ 13 - 5
packages/webidl/src/webidlparser.pp

@@ -1335,7 +1335,7 @@ function TWebIDLParser.ParseType(aParent : TIDLBaseObject; FetchFirst : Boolean
 
 (* On Entry
    if FetchFirst = true we're on "typedef", "(", "or" or "<" tokens.
-   if FetchFirst = true we're on the first actual token
+   if FetchFirst = false we're on the first actual token
    On exit, we're on the first token after the type
 
    *)
@@ -1353,7 +1353,7 @@ Const
   LegacyDOMString = 'LegacyNullToEmptyString';
 
 Var
-  isNull,isUnsigned, ok: Boolean;
+  haveID,isNull,isUnsigned, isDoubleLong, ok: Boolean;
   typeName: UTF8String;
   Allowed : TIDLTokens;
   tk : TIDLToken;
@@ -1367,21 +1367,28 @@ begin
       tk:=GetToken
     else
       tk:=CurrentToken;
+    HaveID:=False;
     if tk=tkSquaredBraceOpen then
       begin
       ExpectToken(tkIdentifier);
       case CurrentTokenString of
       EnforceRange:
         begin
-        // special: [EnforceRange] unsigned long
+        // special: [EnforceRange] [unsigned] long [long]
         ExpectToken(tkSquaredBraceClose);
         tk:=GetToken;
         isUnsigned:=(tk=tkUnsigned);
         if IsUnSigned then
           tk:=GetToken;
         CheckCurrentToken(tkLong);
+        tk:=GetToken;
+        isDoubleLong:=(tk=tkLong);
+        haveID:=(tk=tkIdentifier);
         Result:=TIDLTypeDefDefinition(AddDefinition(aParent,TIDLTypeDefDefinition,''));
-        Result.TypeName:='long';
+        if IsDoubleLong then
+          Result.TypeName:='long long'
+        else
+          Result.TypeName:='long';
         if IsUnsigned then
           Result.Name:='unsigned '+Result.Name;
         Result.Attributes.Add(EnforceRange);
@@ -1398,7 +1405,8 @@ begin
       else
         Error(SErrInvalidToken,[LegacyDOMString,CurrentTokenString]);
       end;
-      GetToken;
+      if not HaveID then
+        GetToken;
       ok:=true;
       exit;
       end;

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

@@ -67,7 +67,10 @@ Type
     Procedure TestSimpleInt;
     procedure TestSimpleIntNull;
     Procedure TestSimpleLongint;
+    Procedure TestSimpleint64;
+    procedure TestSimpleQWord;
     Procedure TestSimpleAttrLong;
+    Procedure TestSimpleAttrLongLong;
     procedure TestSimpleLongintNull;
     Procedure TestSimpleLongLongint;
     Procedure TestSimpleLongLongintNull;
@@ -1074,9 +1077,24 @@ begin
   TestTypeDef('long A','A','long');
 end;
 
+procedure TTestTypeDefParser.TestSimpleint64;
+begin
+  TestTypeDef('long long A','A','long long');
+end;
+
+procedure TTestTypeDefParser.TestSimpleQWord;
+begin
+  TestTypeDef('unsigned long long A','A','unsigned long long');
+end;
+
 procedure TTestTypeDefParser.TestSimpleAttrLong;
 begin
-  TestTypeDef('typedef [EnforceRange] long A','A','long')
+  TestTypeDef('[EnforceRange] long A','A','long')
+end;
+
+procedure TTestTypeDefParser.TestSimpleAttrLongLong;
+begin
+  TestTypeDef('[EnforceRange] long long A','A','long long')
 end;
 
 procedure TTestTypeDefParser.TestSimpleLongintNull;