mojoshader_compiler.c
author Ryan C. Gordon <icculus@icculus.org>
Tue, 15 Mar 2011 01:40:04 -0700
changeset 1010 bbfed6061a2e
parent 1009 ba0ed22a4bac
child 1011 0758e03a79d9
permissions -rw-r--r--
Added a FIXME.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
835
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     1
/**
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     2
 * MojoShader; generate shader programs from bytecode of compiled
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     3
 *  Direct3D shaders.
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     4
 *
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     5
 * Please see the file LICENSE.txt in the source's root directory.
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     6
 *
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     7
 *  This file written by Ryan C. Gordon.
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     8
 */
743e14b386f3 Added boilerplate comment to start of file.
Ryan C. Gordon <icculus@icculus.org>
parents: 827
diff changeset
     9
921
97b879e372c6 Added a FIXME.
Ryan C. Gordon <icculus@icculus.org>
parents: 920
diff changeset
    10
// !!! FIXME: this needs to be split into separate source files:
97b879e372c6 Added a FIXME.
Ryan C. Gordon <icculus@icculus.org>
parents: 920
diff changeset
    11
// !!! FIXME:  parse, AST, IR, etc. The problem is we need to deal with the
97b879e372c6 Added a FIXME.
Ryan C. Gordon <icculus@icculus.org>
parents: 920
diff changeset
    12
// !!! FIXME:  "Context" struct being passed around everywhere.
97b879e372c6 Added a FIXME.
Ryan C. Gordon <icculus@icculus.org>
parents: 920
diff changeset
    13
709
6fbd0e20b40f Removed some ANSI C things from the HLSL grammar that shaders don't do.
Ryan C. Gordon <icculus@icculus.org>
parents: 706
diff changeset
    14
#define __MOJOSHADER_INTERNAL__ 1
6fbd0e20b40f Removed some ANSI C things from the HLSL grammar that shaders don't do.
Ryan C. Gordon <icculus@icculus.org>
parents: 706
diff changeset
    15
#include "mojoshader_internal.h"
706
01a92f30b84f Added some basic compiler stub stuff, just to get this building at all.
Ryan C. Gordon <icculus@icculus.org>
parents:
diff changeset
    16
716
94a804b54078 Cleaned up HLSL parser tracing.
Ryan C. Gordon <icculus@icculus.org>
parents: 714
diff changeset
    17
#if DEBUG_COMPILER_PARSER
94a804b54078 Cleaned up HLSL parser tracing.
Ryan C. Gordon <icculus@icculus.org>
parents: 714
diff changeset
    18
#define LEMON_SUPPORT_TRACING 1
94a804b54078 Cleaned up HLSL parser tracing.
Ryan C. Gordon <icculus@icculus.org>
parents: 714
diff changeset
    19
#endif
94a804b54078 Cleaned up HLSL parser tracing.
Ryan C. Gordon <icculus@icculus.org>
parents: 714
diff changeset
    20
916
3738cd265707 Added a FIXME.
Ryan C. Gordon <icculus@icculus.org>
parents: 915
diff changeset
    21
// !!! FIXME: I'd like to lose this. It's really inefficient. Just keep a
3738cd265707 Added a FIXME.
Ryan C. Gordon <icculus@icculus.org>
parents: 915
diff changeset
    22
// !!! FIXME:  (tail) on these list structures instead?
855
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    23
#define REVERSE_LINKED_LIST(typ, head) { \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    24
    if ((head) && (head->next)) { \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    25
        typ *tmp = NULL; \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    26
        typ *tmp1 = NULL; \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    27
        while (head != NULL) { \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    28
            tmp = head; \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    29
            head = head->next; \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    30
            tmp->next = tmp1; \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    31
            tmp1 = tmp; \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    32
        } \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    33
        head = tmp; \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    34
    } \
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    35
}
575a443074af Reverse all the linked lists that we generate backwards in the parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 854
diff changeset
    36
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    37
static inline int operator_is_unary(const MOJOSHADER_astNodeType op)
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    38
{
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    39
    return ( (op > MOJOSHADER_AST_OP_START_RANGE_UNARY) &&
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    40
             (op < MOJOSHADER_AST_OP_END_RANGE_UNARY) );
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    41
} // operator_is_unary
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    42
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    43
static inline int operator_is_binary(const MOJOSHADER_astNodeType op)
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    44
{
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    45
    return ( (op > MOJOSHADER_AST_OP_START_RANGE_BINARY) &&
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    46
             (op < MOJOSHADER_AST_OP_END_RANGE_BINARY) );
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    47
} // operator_is_binary
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    48
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    49
static inline int operator_is_ternary(const MOJOSHADER_astNodeType op)
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    50
{
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    51
    return ( (op > MOJOSHADER_AST_OP_START_RANGE_TERNARY) &&
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    52
             (op < MOJOSHADER_AST_OP_END_RANGE_TERNARY) );
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    53
} // operator_is_ternary
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    54
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    55
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
    56
typedef union TokenData
778
a43d07e5da68 Added some structure for user types (struct at the moment).
Ryan C. Gordon <icculus@icculus.org>
parents: 731
diff changeset
    57
{
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
    58
    int64 i64;
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
    59
    double dbl;
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
    60
    const char *string;
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
    61
    const MOJOSHADER_astDataType *datatype;
778
a43d07e5da68 Added some structure for user types (struct at the moment).
Ryan C. Gordon <icculus@icculus.org>
parents: 731
diff changeset
    62
} TokenData;
a43d07e5da68 Added some structure for user types (struct at the moment).
Ryan C. Gordon <icculus@icculus.org>
parents: 731
diff changeset
    63
a43d07e5da68 Added some structure for user types (struct at the moment).
Ryan C. Gordon <icculus@icculus.org>
parents: 731
diff changeset
    64
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    65
// This tracks data types and variables, and notes when they enter/leave scope.
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    66
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    67
typedef struct SymbolScope
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    68
{
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    69
    const char *symbol;
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
    70
    const MOJOSHADER_astDataType *datatype;
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
    71
    int index;  // unique positive value within a function, negative if global.
1005
7ca34382b740 Make note of how many times a symbol is referenced.
Ryan C. Gordon <icculus@icculus.org>
parents: 1004
diff changeset
    72
    int referenced;  // non-zero if something looked for this symbol (so we know it's used).
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    73
    struct SymbolScope *next;
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    74
} SymbolScope;
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    75
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    76
typedef struct SymbolMap
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    77
{
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    78
    HashTable *hash;
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    79
    SymbolScope *scope;
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    80
} SymbolMap;
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    81
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    82
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    83
// Compile state, passed around all over the place.
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    84
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    85
typedef struct Context
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    86
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    87
    int isfail;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    88
    int out_of_memory;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    89
    MOJOSHADER_malloc malloc;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    90
    MOJOSHADER_free free;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    91
    void *malloc_data;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    92
    ErrorList *errors;
935
bef902f8b4d9 More filling in of API details. Framework is mostly complete now.
Ryan C. Gordon <icculus@icculus.org>
parents: 932
diff changeset
    93
    ErrorList *warnings;
858
d51537335896 Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents: 857
diff changeset
    94
    StringCache *strcache;
844
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
    95
    const char *sourcefile;  // current source file that we're parsing.
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
    96
    unsigned int sourceline; // current line in sourcefile that we're parsing.
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    97
    SymbolMap usertypes;
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    98
    SymbolMap variables;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    99
    MOJOSHADER_astNode *ast;  // Abstract Syntax Tree
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   100
    const char *source_profile;
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   101
    int is_func_scope; // non-zero if semantic analysis is in function scope.
1004
650ee7802725 Semantic analysis: make sure break and continue are inside loops and switches.
Ryan C. Gordon <icculus@icculus.org>
parents: 1003
diff changeset
   102
    int loop_count;
650ee7802725 Semantic analysis: make sure break and continue are inside loops and switches.
Ryan C. Gordon <icculus@icculus.org>
parents: 1003
diff changeset
   103
    int switch_count;
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   104
    int var_index;  // next variable index for current function.
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   105
    int global_var_index;  // next variable index for global scope.
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   106
    int user_func_index;  // next function index for user-defined functions.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   107
    int intrinsic_func_index;  // next function index for intrinsic functions.
923
859fc7151d43 Fill in some default strings in the cache, so we can always compare by pointer.
Ryan C. Gordon <icculus@icculus.org>
parents: 922
diff changeset
   108
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   109
    // Cache intrinsic types for fast lookup and consistent pointer values.
976
72f121a58548 Clean up bogus usertypes leftover from parse phase, during semantic analysis.
Ryan C. Gordon <icculus@icculus.org>
parents: 975
diff changeset
   110
    MOJOSHADER_astDataType dt_none;
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   111
    MOJOSHADER_astDataType dt_bool;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   112
    MOJOSHADER_astDataType dt_int;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   113
    MOJOSHADER_astDataType dt_uint;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   114
    MOJOSHADER_astDataType dt_float;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   115
    MOJOSHADER_astDataType dt_float_snorm;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   116
    MOJOSHADER_astDataType dt_float_unorm;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   117
    MOJOSHADER_astDataType dt_half;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   118
    MOJOSHADER_astDataType dt_double;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   119
    MOJOSHADER_astDataType dt_string;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   120
    MOJOSHADER_astDataType dt_sampler1d;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   121
    MOJOSHADER_astDataType dt_sampler2d;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   122
    MOJOSHADER_astDataType dt_sampler3d;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   123
    MOJOSHADER_astDataType dt_samplercube;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   124
    MOJOSHADER_astDataType dt_samplerstate;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   125
    MOJOSHADER_astDataType dt_samplercompstate;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   126
    MOJOSHADER_astDataType dt_buf_bool;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   127
    MOJOSHADER_astDataType dt_buf_int;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   128
    MOJOSHADER_astDataType dt_buf_uint;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   129
    MOJOSHADER_astDataType dt_buf_half;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   130
    MOJOSHADER_astDataType dt_buf_float;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   131
    MOJOSHADER_astDataType dt_buf_double;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   132
    MOJOSHADER_astDataType dt_buf_float_snorm;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   133
    MOJOSHADER_astDataType dt_buf_float_unorm;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   134
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   135
    Buffer *garbage;  // this is sort of hacky.
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   136
} Context;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   137
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   138
940
bc2a5efade5e Added a bunch of FIXMEs to accurately portray current technical debt.
Ryan C. Gordon <icculus@icculus.org>
parents: 939
diff changeset
   139
// !!! FIXME: cut and paste between every damned source file follows...
bc2a5efade5e Added a bunch of FIXMEs to accurately portray current technical debt.
Ryan C. Gordon <icculus@icculus.org>
parents: 939
diff changeset
   140
// !!! FIXME: We need to make some sort of ContextBase that applies to all
bc2a5efade5e Added a bunch of FIXMEs to accurately portray current technical debt.
Ryan C. Gordon <icculus@icculus.org>
parents: 939
diff changeset
   141
// !!! FIXME:  files and move this stuff to mojoshader_common.c ...
bc2a5efade5e Added a bunch of FIXMEs to accurately portray current technical debt.
Ryan C. Gordon <icculus@icculus.org>
parents: 939
diff changeset
   142
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   143
// Convenience functions for allocators...
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   144
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   145
static inline void out_of_memory(Context *ctx)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   146
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   147
    ctx->isfail = ctx->out_of_memory = 1;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   148
} // out_of_memory
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   149
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   150
static inline void *Malloc(Context *ctx, const size_t len)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   151
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   152
    void *retval = ctx->malloc((int) len, ctx->malloc_data);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   153
    if (retval == NULL)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   154
        out_of_memory(ctx);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   155
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   156
} // Malloc
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   157
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   158
static inline char *StrDup(Context *ctx, const char *str)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   159
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   160
    char *retval = (char *) Malloc(ctx, strlen(str) + 1);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   161
    if (retval != NULL)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   162
        strcpy(retval, str);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   163
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   164
} // StrDup
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   165
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   166
static inline void Free(Context *ctx, void *ptr)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   167
{
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   168
    ctx->free(ptr, ctx->malloc_data);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   169
} // Free
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   170
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   171
static void *MallocBridge(int bytes, void *data)
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   172
{
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   173
    return Malloc((Context *) data, (size_t) bytes);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   174
} // MallocBridge
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   175
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   176
static void FreeBridge(void *ptr, void *data)
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   177
{
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   178
    Free((Context *) data, ptr);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   179
} // FreeBridge
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   180
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   181
static void failf(Context *ctx, const char *fmt, ...) ISPRINTF(2,3);
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   182
static void failf(Context *ctx, const char *fmt, ...)
842
1ea7f51250fb A little work on error handling in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 839
diff changeset
   183
{
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   184
    ctx->isfail = 1;
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   185
    if (ctx->out_of_memory)
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   186
        return;
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   187
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   188
    va_list ap;
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   189
    va_start(ap, fmt);
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   190
    errorlist_add_va(ctx->errors, ctx->sourcefile, ctx->sourceline, fmt, ap);
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   191
    va_end(ap);
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   192
} // failf
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   193
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   194
static inline void fail(Context *ctx, const char *reason)
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   195
{
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   196
    failf(ctx, "%s", reason);
842
1ea7f51250fb A little work on error handling in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 839
diff changeset
   197
} // fail
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   198
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   199
static void warnf(Context *ctx, const char *fmt, ...) ISPRINTF(2,3);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   200
static void warnf(Context *ctx, const char *fmt, ...)
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   201
{
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   202
    if (ctx->out_of_memory)
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   203
        return;
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   204
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   205
    va_list ap;
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   206
    va_start(ap, fmt);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   207
    errorlist_add_va(ctx->warnings, ctx->sourcefile, ctx->sourceline, fmt, ap);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   208
    va_end(ap);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   209
} // warnf
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   210
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   211
static inline void warn(Context *ctx, const char *reason)
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   212
{
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   213
    warnf(ctx, "%s", reason);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   214
} // warn
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   215
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   216
static inline int isfail(const Context *ctx)
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   217
{
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   218
    return ctx->isfail;
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   219
} // isfail
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   220
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   221
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   222
static void symbolmap_nuke(const void *k, const void *v, void *d) {/*no-op*/}
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   223
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   224
static int create_symbolmap(Context *ctx, SymbolMap *map)
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   225
{
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   226
    // !!! FIXME: should compare string pointer, with string in cache.
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   227
    map->scope = NULL;
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   228
    map->hash = hash_create(ctx, hash_hash_string, hash_keymatch_string,
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   229
                            symbolmap_nuke, 1, MallocBridge, FreeBridge, ctx);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   230
    return (map->hash != NULL);
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   231
} // create_symbolmap
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   232
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   233
static int datatypes_match(const MOJOSHADER_astDataType *a,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   234
                           const MOJOSHADER_astDataType *b)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   235
{
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   236
    int i;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   237
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   238
    if (a == b)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   239
        return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   240
    else if (a->type != b->type)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   241
        return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   242
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   243
    switch (a->type)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   244
    {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   245
        case MOJOSHADER_AST_DATATYPE_STRUCT:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   246
            if (a->structure.member_count != b->structure.member_count)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   247
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   248
            for (i = 0; i < a->structure.member_count; i++)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   249
            {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   250
                if (!datatypes_match(a->structure.members[i].datatype,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   251
                                     b->structure.members[i].datatype))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   252
                    return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   253
                // stringcache'd, pointer compare is safe.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   254
                else if (a->structure.members[i].identifier !=
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   255
                         b->structure.members[i].identifier)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   256
                    return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   257
            } // for
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   258
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   259
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   260
        case MOJOSHADER_AST_DATATYPE_ARRAY:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   261
            if (a->array.elements != b->array.elements)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   262
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   263
            else if (!datatypes_match(a->array.base, b->array.base))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   264
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   265
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   266
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   267
        case MOJOSHADER_AST_DATATYPE_VECTOR:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   268
            if (a->vector.elements != b->vector.elements)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   269
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   270
            else if (!datatypes_match(a->vector.base, b->vector.base))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   271
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   272
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   273
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   274
        case MOJOSHADER_AST_DATATYPE_MATRIX:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   275
            if (a->matrix.rows != b->matrix.rows)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   276
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   277
            else if (a->matrix.columns != b->matrix.columns)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   278
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   279
            else if (!datatypes_match(a->matrix.base, b->matrix.base))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   280
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   281
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   282
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   283
        case MOJOSHADER_AST_DATATYPE_BUFFER:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   284
            return datatypes_match(a->buffer.base, b->buffer.base);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   285
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   286
        case MOJOSHADER_AST_DATATYPE_FUNCTION:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   287
            if (a->function.num_params != b->function.num_params)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   288
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   289
            else if (a->function.intrinsic != b->function.intrinsic)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   290
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   291
            else if (!datatypes_match(a->function.retval, b->function.retval))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   292
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   293
            for (i = 0; i < a->function.num_params; i++)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   294
            {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   295
                if (!datatypes_match(a->function.params[i], b->function.params[i]))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   296
                    return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   297
            } // for
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   298
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   299
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   300
        case MOJOSHADER_AST_DATATYPE_USER:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   301
            return 0;  // pointers must match, this clearly didn't.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   302
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   303
        default:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   304
            assert(0 && "unexpected case");
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   305
            return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   306
    } // switch
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   307
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   308
    return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   309
} // datatypes_match
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   310
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   311
static void push_symbol(Context *ctx, SymbolMap *map, const char *sym,
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   312
                        const MOJOSHADER_astDataType *dt, const int index,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   313
                        const int check_dupes)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   314
{
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   315
    if (ctx->out_of_memory)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   316
        return;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   317
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   318
    // Decide if this symbol is defined, and if it's in the current scope.
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   319
    SymbolScope *item = NULL;
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   320
    const void *value = NULL;
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   321
    if ((check_dupes) && (sym != NULL) && (hash_find(map->hash, sym, &value)))
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   322
    {
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   323
        // check the current scope for a dupe.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   324
        // !!! FIXME: note current scope's starting index, see if found
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   325
        // !!! FIXME:  item is < index (and thus, a previous scope).
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   326
        item = map->scope;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   327
        while ((item) && (item->symbol))
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   328
        {
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   329
            if ( ((const void *) item) == value )
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   330
            {
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   331
                failf(ctx, "Symbol '%s' already defined", sym);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   332
                return;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   333
            } // if
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   334
            item = item->next;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   335
        } // while
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   336
    } // if
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   337
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   338
    // Add the symbol to our map and scope stack.
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   339
    item = (SymbolScope *) Malloc(ctx, sizeof (SymbolScope));
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   340
    if (item == NULL)
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   341
        return;
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   342
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   343
    if (sym != NULL)  // sym can be NULL if we're pushing a new scope.
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   344
    {
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   345
        if (hash_insert(map->hash, sym, item) == -1)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   346
        {
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   347
            Free(ctx, item);
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   348
            return;
929
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   349
        } // if
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   350
    } // if
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   351
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   352
    item->symbol = sym;  // cached strings, don't copy.
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   353
    item->index = index;
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   354
    item->datatype = dt;
1005
7ca34382b740 Make note of how many times a symbol is referenced.
Ryan C. Gordon <icculus@icculus.org>
parents: 1004
diff changeset
   355
    item->referenced = 0;
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   356
    item->next = map->scope;
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   357
    map->scope = item;
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   358
} // push_symbol
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   359
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   360
static void push_usertype(Context *ctx, const char *sym, const MOJOSHADER_astDataType *dt)
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   361
{
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   362
    if (sym != NULL)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   363
    {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   364
        MOJOSHADER_astDataType *userdt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   365
        userdt = (MOJOSHADER_astDataType *) Malloc(ctx, sizeof (*userdt));
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   366
        if (userdt != NULL)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   367
        {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   368
            // !!! FIXME: this is hacky.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   369
            if (!buffer_append(ctx->garbage, &userdt, sizeof (userdt)))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   370
            {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   371
                Free(ctx, userdt);
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   372
                userdt = NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   373
            } // if
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   374
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   375
            userdt->type = MOJOSHADER_AST_DATATYPE_USER;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   376
            userdt->user.details = dt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   377
            userdt->user.name = sym;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   378
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   379
            dt = userdt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   380
        } // if
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   381
    } // if
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   382
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   383
    push_symbol(ctx, &ctx->usertypes, sym, dt, 0, 1);
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   384
} // push_usertype
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   385
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   386
static inline void push_variable(Context *ctx, const char *sym, const MOJOSHADER_astDataType *dt)
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   387
{
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   388
    int idx = 0;
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   389
    if (sym != NULL)
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   390
    {
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   391
        if (ctx->is_func_scope)
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   392
            idx = ++ctx->var_index;  // these are positive.
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   393
        else
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   394
            idx = --ctx->global_var_index;  // these are negative.
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   395
    } // if
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   396
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   397
    push_symbol(ctx, &ctx->variables, sym, dt, idx, 1);
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   398
} // push_variable
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   399
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   400
static void push_function(Context *ctx, const char *sym,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   401
                          const MOJOSHADER_astDataType *dt,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   402
                          const int just_declare)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   403
{
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   404
    // we don't have any reason to support nested functions at the moment,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   405
    //  so this would be a bug.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   406
    assert(!ctx->is_func_scope);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   407
    assert(dt->type == MOJOSHADER_AST_DATATYPE_FUNCTION);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   408
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   409
    int idx = 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   410
    if ((sym != NULL) && (dt != NULL))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   411
    {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   412
        if (!dt->function.intrinsic)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   413
            idx = ++ctx->user_func_index;  // these are positive.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   414
        else
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   415
            idx = --ctx->intrinsic_func_index;  // these are negative.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   416
    } // if
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   417
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   418
    // Functions are always global, so no need to search scopes.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   419
    //  Functions overload, though, so we have to continue iterating to
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   420
    //  see if it matches anything.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   421
    const void *value = NULL;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   422
    void *iter = NULL;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   423
    while (hash_iter(ctx->variables.hash, sym, &value, &iter))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   424
    {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   425
        // there's already something called this.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   426
        if (datatypes_match(dt, ((SymbolScope *) value)->datatype))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   427
        {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   428
            if (!just_declare)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   429
                failf(ctx, "Function '%s' already defined.", sym);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   430
            return;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   431
        } // if
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   432
    } // while
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   433
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   434
    // push_symbol() doesn't check dupes, because we just did.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   435
    push_symbol(ctx, &ctx->variables, sym, dt, idx, 0);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   436
} // push_function
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   437
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   438
static inline void push_scope(Context *ctx)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   439
{
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   440
    push_usertype(ctx, NULL, NULL);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   441
    push_variable(ctx, NULL, NULL);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   442
} // push_scope
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   443
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   444
static void pop_symbol(Context *ctx, SymbolMap *map)
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   445
{
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   446
    SymbolScope *item = map->scope;
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   447
    if (!item)
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   448
        return;
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   449
    if (item->symbol)
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   450
        hash_remove(map->hash, item->symbol);
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   451
    map->scope = item->next;
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   452
    Free(ctx, item);
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   453
} // pop_symbol
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   454
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   455
static void pop_symbol_scope(Context *ctx, SymbolMap *map)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   456
{
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   457
    while ((map->scope) && (map->scope->symbol))
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   458
        pop_symbol(ctx, map);
850
473108b0366d Fixed pop_scope().
Ryan C. Gordon <icculus@icculus.org>
parents: 849
diff changeset
   459
473108b0366d Fixed pop_scope().
Ryan C. Gordon <icculus@icculus.org>
parents: 849
diff changeset
   460
    assert(map->scope != NULL);
473108b0366d Fixed pop_scope().
Ryan C. Gordon <icculus@icculus.org>
parents: 849
diff changeset
   461
    assert(map->scope->symbol == NULL);
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   462
    pop_symbol(ctx, map);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   463
} // pop_symbol_scope
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   464
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   465
static inline void pop_scope(Context *ctx)
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   466
{
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   467
    pop_symbol_scope(ctx, &ctx->usertypes);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   468
    pop_symbol_scope(ctx, &ctx->variables);
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   469
} // push_scope
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   470
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   471
static const MOJOSHADER_astDataType *find_symbol(Context *ctx, SymbolMap *map, const char *sym, int *_index)
929
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   472
{
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   473
    const void *_item = NULL;
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   474
    hash_find(map->hash, sym, &_item);
967
51ce9d8a7533 Fixed incorrect variable reference.
Ryan C. Gordon <icculus@icculus.org>
parents: 966
diff changeset
   475
    SymbolScope *item = (SymbolScope *) _item;
1005
7ca34382b740 Make note of how many times a symbol is referenced.
Ryan C. Gordon <icculus@icculus.org>
parents: 1004
diff changeset
   476
    if (item != NULL)
7ca34382b740 Make note of how many times a symbol is referenced.
Ryan C. Gordon <icculus@icculus.org>
parents: 1004
diff changeset
   477
    {
7ca34382b740 Make note of how many times a symbol is referenced.
Ryan C. Gordon <icculus@icculus.org>
parents: 1004
diff changeset
   478
        item->referenced++;
7ca34382b740 Make note of how many times a symbol is referenced.
Ryan C. Gordon <icculus@icculus.org>
parents: 1004
diff changeset
   479
        if (_index != NULL)
7ca34382b740 Make note of how many times a symbol is referenced.
Ryan C. Gordon <icculus@icculus.org>
parents: 1004
diff changeset
   480
            *_index = item->index;
7ca34382b740 Make note of how many times a symbol is referenced.
Ryan C. Gordon <icculus@icculus.org>
parents: 1004
diff changeset
   481
    } // if
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   482
    return item ? item->datatype : NULL;
929
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   483
} // find_symbol
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   484
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   485
static inline const MOJOSHADER_astDataType *find_usertype(Context *ctx, const char *sym)
929
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   486
{
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   487
    return find_symbol(ctx, &ctx->usertypes, sym, NULL);
929
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   488
} // find_usertype
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   489
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   490
static inline const MOJOSHADER_astDataType *find_variable(Context *ctx, const char *sym, int *_index)
929
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   491
{
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   492
    return find_symbol(ctx, &ctx->variables, sym, _index);
929
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   493
} // find_variable
5d2d66bd35e7 First shot at semantic analysis (take the AST and type check, make sane, etc).
Ryan C. Gordon <icculus@icculus.org>
parents: 928
diff changeset
   494
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   495
static void destroy_symbolmap(Context *ctx, SymbolMap *map)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   496
{
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   497
    while (map->scope)
937
94e50ba3f956 Workaround for failing parse for now.
Ryan C. Gordon <icculus@icculus.org>
parents: 936
diff changeset
   498
        pop_symbol(ctx, map);
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   499
    hash_destroy(map->hash);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   500
} // destroy_symbolmap
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   501
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   502
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   503
static const MOJOSHADER_astDataType *new_datatype_vector(Context *ctx,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   504
                                            const MOJOSHADER_astDataType *dt,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   505
                                            const int columns)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   506
{
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   507
    MOJOSHADER_astDataType *retval;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   508
    retval = (MOJOSHADER_astDataType *) Malloc(ctx, sizeof (*retval));
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   509
    if (retval == NULL)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   510
        return NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   511
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   512
    // !!! FIXME: this is hacky.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   513
    // !!! FIXME:  I'd like to cache these anyhow and reuse types.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   514
    if (!buffer_append(ctx->garbage, &retval, sizeof (retval)))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   515
    {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   516
        Free(ctx, retval);
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   517
        return NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   518
    } // if
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   519
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   520
    if ((columns < 1) || (columns > 4))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   521
        fail(ctx, "Vector must have between 1 and 4 elements");
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   522
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   523
    retval->type = MOJOSHADER_AST_DATATYPE_VECTOR;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   524
    retval->vector.base = dt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   525
    retval->vector.elements = columns;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   526
    return retval;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   527
} // new_datatype_vector
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   528
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   529
static const MOJOSHADER_astDataType *new_datatype_matrix(Context *ctx,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   530
                                            const MOJOSHADER_astDataType *dt,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   531
                                            const int rows, const int columns)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   532
{
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   533
    MOJOSHADER_astDataType *retval;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   534
    // !!! FIXME: allocate enough for a matrix, but we need to cleanup things that copy without checking for subsize.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   535
    retval = (MOJOSHADER_astDataType *) Malloc(ctx, sizeof (*retval));
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   536
    if (retval == NULL)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   537
        return NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   538
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   539
    // !!! FIXME: this is hacky.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   540
    // !!! FIXME:  I'd like to cache these anyhow and reuse types.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   541
    if (!buffer_append(ctx->garbage, &retval, sizeof (retval)))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   542
    {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   543
        Free(ctx, retval);
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   544
        return NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   545
    } // if
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   546
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   547
    if ((rows < 1) || (rows > 4))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   548
        fail(ctx, "Matrix must have between 1 and 4 rows");
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   549
    if ((columns < 1) || (columns > 4))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   550
        fail(ctx, "Matrix must have between 1 and 4 columns");
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   551
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   552
    retval->type = MOJOSHADER_AST_DATATYPE_MATRIX;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   553
    retval->matrix.base = dt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   554
    retval->matrix.rows = rows;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   555
    retval->matrix.columns = columns;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   556
    return retval;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   557
} // new_datatype_matrix
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   558
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   559
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   560
// !!! FIXME: move this to mojoshader_ast.c
940
bc2a5efade5e Added a bunch of FIXMEs to accurately portray current technical debt.
Ryan C. Gordon <icculus@icculus.org>
parents: 939
diff changeset
   561
// !!! FIXME: new_* and delete_* should take an allocator, not a context.
bc2a5efade5e Added a bunch of FIXMEs to accurately portray current technical debt.
Ryan C. Gordon <icculus@icculus.org>
parents: 939
diff changeset
   562
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   563
// These functions are mostly for construction and cleanup of nodes in the
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   564
//  parse tree. Mostly this is simple allocation and initialization, so we
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   565
//  can do as little in the lemon code as possible, and then sort it all out
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   566
//  afterwards.
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   567
844
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   568
#define NEW_AST_NODE(retval, cls, typ) \
883
df6265a993bc Fixed C++ compiler error.
Ryan C. Gordon <icculus@icculus.org>
parents: 868
diff changeset
   569
    cls *retval = (cls *) Malloc(ctx, sizeof (cls)); \
844
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   570
    do { \
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   571
        if (retval == NULL) { return NULL; } \
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   572
        retval->ast.type = typ; \
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   573
        retval->ast.filename = ctx->sourcefile; \
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   574
        retval->ast.line = ctx->sourceline; \
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   575
    } while (0)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   576
844
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   577
#define DELETE_AST_NODE(cls) do { \
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   578
    if (!cls) return; \
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   579
} while (0)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   580
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   581
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   582
static void delete_compilation_unit(Context*, MOJOSHADER_astCompilationUnit*);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   583
static void delete_statement(Context *ctx, MOJOSHADER_astStatement *stmt);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   584
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   585
static MOJOSHADER_astExpression *new_identifier_expr(Context *ctx,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   586
                                                     const char *string)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   587
{
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   588
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionIdentifier,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   589
                 MOJOSHADER_AST_OP_IDENTIFIER);
986
805aa6eb75af Fixed some uninitialized memory reads, compliments of valgrind.
Ryan C. Gordon <icculus@icculus.org>
parents: 985
diff changeset
   590
    retval->datatype = NULL;
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   591
    retval->identifier = string;  // cached; don't copy string.
986
805aa6eb75af Fixed some uninitialized memory reads, compliments of valgrind.
Ryan C. Gordon <icculus@icculus.org>
parents: 985
diff changeset
   592
    retval->index = 0;
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   593
    return (MOJOSHADER_astExpression *) retval;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   594
} // new_identifier_expr
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   595
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   596
static MOJOSHADER_astExpression *new_callfunc_expr(Context *ctx,
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   597
                                        const char *identifier,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   598
                                        MOJOSHADER_astArguments *args)
927
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   599
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   600
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionCallFunction,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   601
                 MOJOSHADER_AST_OP_CALLFUNC);
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   602
    MOJOSHADER_astExpression *expr = new_identifier_expr(ctx, identifier);
986
805aa6eb75af Fixed some uninitialized memory reads, compliments of valgrind.
Ryan C. Gordon <icculus@icculus.org>
parents: 985
diff changeset
   603
    retval->datatype = NULL;
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   604
    retval->identifier = (MOJOSHADER_astExpressionIdentifier *) expr;
927
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   605
    retval->args = args;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   606
    return (MOJOSHADER_astExpression *) retval;
927
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   607
} // new_callfunc_expr
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   608
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   609
static MOJOSHADER_astExpression *new_constructor_expr(Context *ctx,
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   610
                                            const MOJOSHADER_astDataType *dt,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   611
                                            MOJOSHADER_astArguments *args)
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   612
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   613
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionConstructor,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   614
                 MOJOSHADER_AST_OP_CONSTRUCTOR);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   615
    retval->datatype = dt;
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   616
    retval->args = args;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   617
    return (MOJOSHADER_astExpression *) retval;
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   618
} // new_constructor_expr
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   619
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   620
static MOJOSHADER_astExpression *new_cast_expr(Context *ctx,
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   621
                                            const MOJOSHADER_astDataType *dt,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   622
                                            MOJOSHADER_astExpression *operand)
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   623
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   624
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionCast, MOJOSHADER_AST_OP_CAST);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   625
    retval->datatype = dt;
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   626
    retval->operand = operand;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   627
    return (MOJOSHADER_astExpression *) retval;
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   628
} // new_cast_expr
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   629
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   630
static MOJOSHADER_astExpression *new_unary_expr(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   631
                                            const MOJOSHADER_astNodeType op,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   632
                                            MOJOSHADER_astExpression *operand)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   633
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   634
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionUnary, op);
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   635
    assert(operator_is_unary(op));
986
805aa6eb75af Fixed some uninitialized memory reads, compliments of valgrind.
Ryan C. Gordon <icculus@icculus.org>
parents: 985
diff changeset
   636
    retval->datatype = NULL;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   637
    retval->operand = operand;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   638
    return (MOJOSHADER_astExpression *) retval;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   639
} // new_unary_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   640
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   641
static MOJOSHADER_astExpression *new_binary_expr(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   642
                                            const MOJOSHADER_astNodeType op,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   643
                                            MOJOSHADER_astExpression *left,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   644
                                            MOJOSHADER_astExpression *right)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   645
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   646
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionBinary, op);
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   647
    assert(operator_is_binary(op));
986
805aa6eb75af Fixed some uninitialized memory reads, compliments of valgrind.
Ryan C. Gordon <icculus@icculus.org>
parents: 985
diff changeset
   648
    retval->datatype = NULL;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   649
    retval->left = left;
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   650
    retval->right = right;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   651
    return (MOJOSHADER_astExpression *) retval;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   652
} // new_binary_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   653
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   654
static MOJOSHADER_astExpression *new_ternary_expr(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   655
                                            const MOJOSHADER_astNodeType op,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   656
                                            MOJOSHADER_astExpression *left,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   657
                                            MOJOSHADER_astExpression *center,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   658
                                            MOJOSHADER_astExpression *right)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   659
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   660
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionTernary, op);
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   661
    assert(operator_is_ternary(op));
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   662
    assert(op == MOJOSHADER_AST_OP_CONDITIONAL);
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   663
    retval->datatype = &ctx->dt_bool;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   664
    retval->left = left;
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   665
    retval->center = center;
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   666
    retval->right = right;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   667
    return (MOJOSHADER_astExpression *) retval;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   668
} // new_ternary_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   669
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   670
static MOJOSHADER_astExpression *new_deref_struct_expr(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   671
                                        MOJOSHADER_astExpression *identifier,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   672
                                        const char *member)
928
c9b0235e9d23 Made struct dereference a separate expression type, not a binary expression.
Ryan C. Gordon <icculus@icculus.org>
parents: 927
diff changeset
   673
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   674
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionDerefStruct,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   675
                 MOJOSHADER_AST_OP_DEREF_STRUCT);
986
805aa6eb75af Fixed some uninitialized memory reads, compliments of valgrind.
Ryan C. Gordon <icculus@icculus.org>
parents: 985
diff changeset
   676
    retval->datatype = NULL;
928
c9b0235e9d23 Made struct dereference a separate expression type, not a binary expression.
Ryan C. Gordon <icculus@icculus.org>
parents: 927
diff changeset
   677
    retval->identifier = identifier;
c9b0235e9d23 Made struct dereference a separate expression type, not a binary expression.
Ryan C. Gordon <icculus@icculus.org>
parents: 927
diff changeset
   678
    retval->member = member;  // cached; don't copy string.
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   679
    retval->isswizzle = 0;  // may change during semantic analysis.
1009
ba0ed22a4bac Note the member index in struct deref, so we don't have to calculate it again.
Ryan C. Gordon <icculus@icculus.org>
parents: 1007
diff changeset
   680
    retval->member_index = 0;  // set during semantic analysis.
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   681
    return (MOJOSHADER_astExpression *) retval;
928
c9b0235e9d23 Made struct dereference a separate expression type, not a binary expression.
Ryan C. Gordon <icculus@icculus.org>
parents: 927
diff changeset
   682
} // new_deref_struct_expr
c9b0235e9d23 Made struct dereference a separate expression type, not a binary expression.
Ryan C. Gordon <icculus@icculus.org>
parents: 927
diff changeset
   683
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   684
static MOJOSHADER_astExpression *new_literal_int_expr(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   685
                                                       const int value)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   686
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   687
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionIntLiteral,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   688
                 MOJOSHADER_AST_OP_INT_LITERAL);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   689
    retval->datatype = &ctx->dt_int;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   690
    retval->value = value;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   691
    return (MOJOSHADER_astExpression *) retval;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   692
} // new_literal_int_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   693
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   694
static MOJOSHADER_astExpression *new_literal_float_expr(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   695
                                                        const double dbl)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   696
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   697
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionFloatLiteral,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   698
                 MOJOSHADER_AST_OP_FLOAT_LITERAL);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   699
    retval->datatype = &ctx->dt_float;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   700
    retval->value = dbl;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   701
    return (MOJOSHADER_astExpression *) retval;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   702
} // new_literal_float_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   703
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   704
static MOJOSHADER_astExpression *new_literal_string_expr(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   705
                                                         const char *string)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   706
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   707
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionStringLiteral,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   708
                 MOJOSHADER_AST_OP_STRING_LITERAL);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   709
    retval->datatype = &ctx->dt_string;
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   710
    retval->string = string;  // cached; don't copy string.
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   711
    return (MOJOSHADER_astExpression *) retval;
924
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   712
} // new_literal_string_expr
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   713
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   714
static MOJOSHADER_astExpression *new_literal_boolean_expr(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   715
                                                          const int value)
924
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   716
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   717
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionBooleanLiteral,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   718
                 MOJOSHADER_AST_OP_BOOLEAN_LITERAL);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   719
    retval->datatype = &ctx->dt_bool;
924
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   720
    retval->value = value;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   721
    return (MOJOSHADER_astExpression *) retval;
924
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   722
} // new_literal_boolean_expr
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   723
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   724
static void delete_arguments(Context *ctx, MOJOSHADER_astArguments *args);
927
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   725
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   726
static void delete_expr(Context *ctx, MOJOSHADER_astExpression *_expr)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   727
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   728
    MOJOSHADER_astNode *expr = (MOJOSHADER_astNode *) _expr;
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   729
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   730
    DELETE_AST_NODE(expr);
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   731
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   732
    if (expr->ast.type == MOJOSHADER_AST_OP_CAST)
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   733
        delete_expr(ctx, expr->cast.operand);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   734
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   735
    else if (expr->ast.type == MOJOSHADER_AST_OP_CONSTRUCTOR)
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   736
        delete_arguments(ctx, expr->constructor.args);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   737
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   738
    else if (expr->ast.type == MOJOSHADER_AST_OP_DEREF_STRUCT)
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   739
        delete_expr(ctx, expr->derefstruct.identifier);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   740
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   741
    else if (operator_is_unary(expr->ast.type))
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   742
        delete_expr(ctx, expr->unary.operand);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   743
844
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   744
    else if (operator_is_binary(expr->ast.type))
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   745
    {
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   746
        delete_expr(ctx, expr->binary.left);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   747
        delete_expr(ctx, expr->binary.right);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   748
    } // else if
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   749
844
06494572317b Make AST nodes a little more generic, add source position info to them.
Ryan C. Gordon <icculus@icculus.org>
parents: 843
diff changeset
   750
    else if (operator_is_ternary(expr->ast.type))
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   751
    {
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   752
        delete_expr(ctx, expr->ternary.left);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   753
        delete_expr(ctx, expr->ternary.center);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   754
        delete_expr(ctx, expr->ternary.right);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   755
    } // else if
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   756
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   757
    else if (expr->ast.type == MOJOSHADER_AST_OP_CALLFUNC)
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   758
    {
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   759
        delete_expr(ctx, (MOJOSHADER_astExpression*)expr->callfunc.identifier);
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   760
        delete_arguments(ctx, expr->callfunc.args);
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   761
    } // else if
845
d10d31b9b695 Removed incorrect assertion.
Ryan C. Gordon <icculus@icculus.org>
parents: 844
diff changeset
   762
d10d31b9b695 Removed incorrect assertion.
Ryan C. Gordon <icculus@icculus.org>
parents: 844
diff changeset
   763
    // rest of operators don't have extra data to free.
d10d31b9b695 Removed incorrect assertion.
Ryan C. Gordon <icculus@icculus.org>
parents: 844
diff changeset
   764
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   765
    Free(ctx, expr);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   766
} // delete_expr
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   767
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   768
static MOJOSHADER_astArguments *new_argument(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   769
                                             MOJOSHADER_astExpression *arg)
927
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   770
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   771
    NEW_AST_NODE(retval, MOJOSHADER_astArguments, MOJOSHADER_AST_ARGUMENTS);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   772
    retval->argument = arg;
927
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   773
    retval->next = NULL;
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   774
    return retval;
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   775
} // new_argument
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   776
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   777
static void delete_arguments(Context *ctx, MOJOSHADER_astArguments *args)
927
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   778
{
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   779
    DELETE_AST_NODE(args);
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   780
    delete_arguments(ctx, args->next);
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   781
    delete_expr(ctx, args->argument);
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   782
    Free(ctx, args);
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   783
} // delete_arguments
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   784
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   785
static MOJOSHADER_astFunctionParameters *new_function_param(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   786
                        const MOJOSHADER_astInputModifier inputmod,
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   787
                        const MOJOSHADER_astDataType *dt,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   788
                        const char *identifier, const char *semantic,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   789
                        const MOJOSHADER_astInterpolationModifier interpmod,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   790
                        MOJOSHADER_astExpression *initializer)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   791
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   792
    NEW_AST_NODE(retval, MOJOSHADER_astFunctionParameters,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   793
                 MOJOSHADER_AST_FUNCTION_PARAMS);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   794
    retval->datatype = dt;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   795
    retval->input_modifier = inputmod;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   796
    retval->identifier = identifier;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   797
    retval->semantic = semantic;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   798
    retval->interpolation_modifier = interpmod;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   799
    retval->initializer = initializer;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   800
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   801
    return retval;
926
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   802
} // new_function_param
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   803
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   804
static void delete_function_params(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   805
                                   MOJOSHADER_astFunctionParameters *params)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   806
{
926
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   807
    DELETE_AST_NODE(params);
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   808
    delete_function_params(ctx, params->next);
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   809
    delete_expr(ctx, params->initializer);
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   810
    Free(ctx, params);
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   811
} // delete_function_params
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   812
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   813
static MOJOSHADER_astFunctionSignature *new_function_signature(Context *ctx,
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   814
                                    const MOJOSHADER_astDataType *dt,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   815
                                    const char *identifier,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   816
                                    MOJOSHADER_astFunctionParameters *params)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   817
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   818
    NEW_AST_NODE(retval, MOJOSHADER_astFunctionSignature,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   819
                 MOJOSHADER_AST_FUNCTION_SIGNATURE);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   820
    retval->datatype = dt;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   821
    retval->identifier = identifier;
926
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   822
    retval->params = params;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   823
    retval->storage_class = MOJOSHADER_AST_FNSTORECLS_NONE;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   824
    retval->semantic = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   825
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   826
} // new_function_signature
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   827
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   828
static void delete_function_signature(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   829
                                      MOJOSHADER_astFunctionSignature *sig)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   830
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   831
    DELETE_AST_NODE(sig);
926
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   832
    delete_function_params(ctx, sig->params);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   833
    Free(ctx, sig);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   834
} // delete_function_signature
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   835
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   836
static MOJOSHADER_astCompilationUnit *new_function(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   837
                                MOJOSHADER_astFunctionSignature *declaration,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   838
                                MOJOSHADER_astStatement *definition)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   839
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   840
    NEW_AST_NODE(retval, MOJOSHADER_astCompilationUnitFunction,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   841
                 MOJOSHADER_AST_COMPUNIT_FUNCTION);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   842
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   843
    retval->declaration = declaration;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   844
    retval->definition = definition;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   845
    return (MOJOSHADER_astCompilationUnit *) retval;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   846
} // new_function
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   847
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   848
static void delete_function(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   849
                            MOJOSHADER_astCompilationUnitFunction *unitfn)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   850
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   851
    DELETE_AST_NODE(unitfn);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   852
    delete_compilation_unit(ctx, unitfn->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   853
    delete_function_signature(ctx, unitfn->declaration);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   854
    delete_statement(ctx, unitfn->definition);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   855
    Free(ctx, unitfn);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   856
} // delete_function
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   857
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   858
static MOJOSHADER_astScalarOrArray *new_scalar_or_array(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   859
                                          const char *ident, const int isvec,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   860
                                          MOJOSHADER_astExpression *dim)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   861
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   862
    NEW_AST_NODE(retval, MOJOSHADER_astScalarOrArray,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   863
                 MOJOSHADER_AST_SCALAR_OR_ARRAY);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   864
    retval->identifier = ident;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   865
    retval->isarray = isvec;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   866
    retval->dimension = dim;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   867
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   868
} // new_scalar_or_array
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   869
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   870
static void delete_scalar_or_array(Context *ctx,MOJOSHADER_astScalarOrArray *s)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   871
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   872
    DELETE_AST_NODE(s);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   873
    delete_expr(ctx, s->dimension);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   874
    Free(ctx, s);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   875
} // delete_scalar_or_array
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   876
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   877
static MOJOSHADER_astTypedef *new_typedef(Context *ctx, const int isconst,
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   878
                                          const MOJOSHADER_astDataType *dt,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   879
                                          MOJOSHADER_astScalarOrArray *soa)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   880
{
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   881
    // we correct this datatype to the final version during semantic analysis.
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   882
    NEW_AST_NODE(retval, MOJOSHADER_astTypedef, MOJOSHADER_AST_TYPEDEF);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   883
    retval->datatype = dt;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   884
    retval->isconst = isconst;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   885
    retval->details = soa;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   886
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   887
} // new_typedef
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   888
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   889
static void delete_typedef(Context *ctx, MOJOSHADER_astTypedef *td)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   890
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   891
    DELETE_AST_NODE(td);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   892
    delete_scalar_or_array(ctx, td->details);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   893
    Free(ctx, td);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   894
} // delete_typedef
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   895
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   896
static MOJOSHADER_astPackOffset *new_pack_offset(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   897
                                                 const char *a, const char *b)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   898
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   899
    NEW_AST_NODE(retval, MOJOSHADER_astPackOffset, MOJOSHADER_AST_PACK_OFFSET);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   900
    retval->ident1 = a;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   901
    retval->ident2 = b;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   902
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   903
} // new_pack_offset
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   904
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   905
static void delete_pack_offset(Context *ctx, MOJOSHADER_astPackOffset *o)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   906
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   907
    DELETE_AST_NODE(o);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   908
    Free(ctx, o);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   909
} // delete_pack_offset
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   910
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   911
static MOJOSHADER_astVariableLowLevel *new_variable_lowlevel(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   912
                                               MOJOSHADER_astPackOffset *po,
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   913
                                               const char *reg)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   914
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   915
    NEW_AST_NODE(retval, MOJOSHADER_astVariableLowLevel,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   916
                 MOJOSHADER_AST_VARIABLE_LOWLEVEL);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   917
    retval->packoffset = po;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   918
    retval->register_name = reg;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   919
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   920
} // new_variable_lowlevel
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   921
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   922
static void delete_variable_lowlevel(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   923
                                     MOJOSHADER_astVariableLowLevel *vll)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   924
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   925
    DELETE_AST_NODE(vll);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   926
    delete_pack_offset(ctx, vll->packoffset);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   927
    Free(ctx, vll);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   928
} // delete_variable_lowlevel
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   929
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   930
static MOJOSHADER_astAnnotations *new_annotation(Context *ctx,
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   931
                                        const MOJOSHADER_astDataType *dt,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   932
                                        MOJOSHADER_astExpression *initializer)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   933
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   934
    NEW_AST_NODE(retval, MOJOSHADER_astAnnotations, MOJOSHADER_AST_ANNOTATION);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   935
    retval->datatype = dt;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   936
    retval->initializer = initializer;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   937
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   938
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   939
} // new_annotation
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   940
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   941
static void delete_annotation(Context *ctx, MOJOSHADER_astAnnotations *annos)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   942
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   943
    DELETE_AST_NODE(annos);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   944
    delete_annotation(ctx, annos->next);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   945
    delete_expr(ctx, annos->initializer);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   946
    Free(ctx, annos);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   947
} // delete_annotation
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   948
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   949
static MOJOSHADER_astVariableDeclaration *new_variable_declaration(
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   950
                            Context *ctx, MOJOSHADER_astScalarOrArray *soa,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   951
                            const char *semantic,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   952
                            MOJOSHADER_astAnnotations *annotations,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   953
                            MOJOSHADER_astExpression *init,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   954
                            MOJOSHADER_astVariableLowLevel *vll)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   955
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   956
    NEW_AST_NODE(retval, MOJOSHADER_astVariableDeclaration,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   957
                 MOJOSHADER_AST_VARIABLE_DECLARATION);
986
805aa6eb75af Fixed some uninitialized memory reads, compliments of valgrind.
Ryan C. Gordon <icculus@icculus.org>
parents: 985
diff changeset
   958
    retval->datatype = NULL;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   959
    retval->attributes = 0;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   960
    retval->anonymous_datatype = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   961
    retval->details = soa;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   962
    retval->semantic = semantic;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   963
    retval->annotations = annotations;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   964
    retval->initializer = init;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   965
    retval->lowlevel = vll;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   966
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   967
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   968
} // new_variable_declaration
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   969
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   970
static void delete_variable_declaration(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   971
                                        MOJOSHADER_astVariableDeclaration *dcl)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   972
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   973
    DELETE_AST_NODE(dcl);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   974
    delete_variable_declaration(ctx, dcl->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   975
    delete_scalar_or_array(ctx, dcl->details);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   976
    delete_annotation(ctx, dcl->annotations);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   977
    delete_expr(ctx, dcl->initializer);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   978
    delete_variable_lowlevel(ctx, dcl->lowlevel);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   979
    Free(ctx, dcl);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   980
} // delete_variable_declaration
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   981
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   982
static MOJOSHADER_astCompilationUnit *new_global_variable(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   983
                                      MOJOSHADER_astVariableDeclaration *decl)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   984
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   985
    NEW_AST_NODE(retval, MOJOSHADER_astCompilationUnitVariable,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   986
                 MOJOSHADER_AST_COMPUNIT_VARIABLE);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   987
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   988
    retval->declaration = decl;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   989
    return (MOJOSHADER_astCompilationUnit *) retval;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   990
} // new_global_variable
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   991
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   992
static void delete_global_variable(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   993
                                   MOJOSHADER_astCompilationUnitVariable *var)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   994
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   995
    DELETE_AST_NODE(var);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   996
    delete_compilation_unit(ctx, var->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   997
    delete_variable_declaration(ctx, var->declaration);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   998
    Free(ctx, var);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   999
} // delete_global_variable
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1000
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1001
static MOJOSHADER_astCompilationUnit *new_global_typedef(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1002
                                                     MOJOSHADER_astTypedef *td)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1003
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1004
    NEW_AST_NODE(retval, MOJOSHADER_astCompilationUnitTypedef,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1005
                 MOJOSHADER_AST_COMPUNIT_TYPEDEF);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1006
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1007
    retval->type_info = td;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1008
    return (MOJOSHADER_astCompilationUnit *) retval;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1009
} // new_global_typedef
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1010
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1011
static void delete_global_typedef(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1012
                                  MOJOSHADER_astCompilationUnitTypedef *unit)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1013
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1014
    DELETE_AST_NODE(unit);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1015
    delete_compilation_unit(ctx, unit->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1016
    delete_typedef(ctx, unit->type_info);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1017
    Free(ctx, unit);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1018
} // delete_global_typedef
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1019
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1020
static MOJOSHADER_astStructMembers *new_struct_member(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1021
                                            MOJOSHADER_astScalarOrArray *soa,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1022
                                            const char *semantic)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1023
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1024
    NEW_AST_NODE(retval, MOJOSHADER_astStructMembers,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1025
                 MOJOSHADER_AST_STRUCT_MEMBER);
986
805aa6eb75af Fixed some uninitialized memory reads, compliments of valgrind.
Ryan C. Gordon <icculus@icculus.org>
parents: 985
diff changeset
  1026
    retval->datatype = NULL;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1027
    retval->semantic = semantic;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1028
    retval->details = soa;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1029
    retval->interpolation_mod = MOJOSHADER_AST_INTERPMOD_NONE;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1030
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1031
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1032
} // new_struct_member
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1033
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1034
static void delete_struct_member(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1035
                                 MOJOSHADER_astStructMembers *member)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1036
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1037
    DELETE_AST_NODE(member);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1038
    delete_struct_member(ctx, member->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1039
    delete_scalar_or_array(ctx, member->details);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1040
    Free(ctx, member);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1041
} // delete_struct_member
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1042
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1043
static MOJOSHADER_astStructDeclaration *new_struct_declaration(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1044
                                        const char *name,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1045
                                        MOJOSHADER_astStructMembers *members)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1046
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1047
    NEW_AST_NODE(retval, MOJOSHADER_astStructDeclaration,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1048
                 MOJOSHADER_AST_STRUCT_DECLARATION);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
  1049
    retval->datatype = NULL;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1050
    retval->name = name;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1051
    retval->members = members;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1052
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1053
} // new_struct_declaration
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1054
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1055
static void delete_struct_declaration(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1056
                                      MOJOSHADER_astStructDeclaration *decl)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1057
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1058
    DELETE_AST_NODE(decl);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1059
    delete_struct_member(ctx, decl->members);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1060
    Free(ctx, decl);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1061
} // delete_struct_declaration
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1062
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1063
static MOJOSHADER_astCompilationUnit *new_global_struct(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1064
                                           MOJOSHADER_astStructDeclaration *sd)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1065
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1066
    NEW_AST_NODE(retval, MOJOSHADER_astCompilationUnitStruct,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1067
                 MOJOSHADER_AST_COMPUNIT_STRUCT);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1068
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1069
    retval->struct_info = sd;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1070
    return (MOJOSHADER_astCompilationUnit *) retval;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1071
} // new_global_struct
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1072
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1073
static void delete_global_struct(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: