Skip to content

  • Projects
  • Groups
  • Snippets
  • Help
  • This project
    • Loading...
  • Sign in / Register
A
angle
  • Project
    • Overview
    • Details
    • Activity
    • Cycle Analytics
  • Repository
    • Repository
    • Files
    • Commits
    • Branches
    • Tags
    • Contributors
    • Graph
    • Compare
    • Charts
  • Issues 0
    • Issues 0
    • List
    • Board
    • Labels
    • Milestones
  • Merge Requests 0
    • Merge Requests 0
  • CI / CD
    • CI / CD
    • Pipelines
    • Jobs
    • Schedules
    • Charts
  • Wiki
    • Wiki
  • Snippets
    • Snippets
  • Members
    • Members
  • Collapse sidebar
  • Activity
  • Graph
  • Charts
  • Create a new issue
  • Jobs
  • Commits
  • Issue Boards
  • Chen Yisong
  • angle
  • Repository

Switch branch/tag
  • angle
  • src
  • compiler
  • preprocessor
  • ExpressionParser.h
Find file
BlameHistoryPermalink
  • Olli Etuaho's avatar
    Allow limited form of expressions in #line directives · 247374cb
    Olli Etuaho authored Sep 09, 2015
    Reuse ExpressionParser that's also used for parsing preprocessor
    conditionals to parse line and file numbers in #line directives.
    According to recent Khronos discussions, the intent of the spec is that
    expressions in #line directives should be interpreted similarly to
    expressions in conditional directives, so reusing ExpressionParser is a
    natural way to implement this. This enables simple math operators
    operating on integers. There are a few unclear corner cases, but this
    approach is enough to support practical use cases and pass the dEQP
    tests.
    
    Valid line directives have one of the following forms:
    
     #line line-expression
     #line line-expression file-expression
    
    ExpressionParser is first run to parse the line-expression. In ambiguous
    cases the ExpressionParser consumes as much of the line as possible to
    form line-expression. Then, if end-of-line hasn't been reached,
    file-expression is parsed by running ExpressionParser again. As an
    example of an ambiguous case:
    
     #line 1 + 2
    
    This could alternatively be interpreted to mean line-expression "1" and
    file-expression "+ 2" where + is the unary + operator, but ANGLE now
    interprets it to mean line-expression "1 + 2". Because of these ambiguous
    cases, a bison grammar that would parse multiple expressions on the same
    line couldn't be easily constructed, so this solution where
    ExpressionParser is run twice was chosen instead.
    
    The problematic corner cases are:
    
    - ExpressionParser uses 64-bit integers internally for evaluating the
    expression's value. It's possible to interpret the ESSL3 spec so that
    32-bit integer wraparound behavior would be required also for #line
    directive expressions.
    
    - It's unclear whether the defined operator can be used in #line
    expressions. In this patch it is disabled. Hoping for further
    clarification from Khronos.
    
    - It's unclear how short-circuiting should affect the parsing of
    undefined identifiers in #line expressions. Now it's consistent with #if
    expressions (undefined identifiers are OK if they're short-circuited).
    
    dEQP expectations are updated for preprocessor tests, including ones
    not affected specifically by this change.
    
    BUG=angleproject:989
    TEST=angle_unittests,
         dEQP-GLES3.functional.shaders.preprocessor.* (4 start passing),
         dEQP-GLES2.functional.shaders.preprocessor.* (4 start passing)
    
    Change-Id: I55c5bf75857da5de855cc600d3603ee19399f328
    Reviewed-on: https://chromium-review.googlesource.com/300964Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org>
    Tryjob-Request: Olli Etuaho <oetuaho@nvidia.com>
    Tested-by: 's avatarOlli Etuaho <oetuaho@nvidia.com>
    247374cb
ExpressionParser.h 980 Bytes
EditWeb IDE
×

Replace ExpressionParser.h

Attach a file by drag & drop or click to upload


Cancel
A new branch will be created in your fork and a new merge request will be started.