mojoshader_compiler.c
author Ryan C. Gordon <icculus@icculus.org>
Tue, 18 Jan 2011 10:42:25 -0800
changeset 981 bfcdebd39e5b
parent 980 83e96d285449
child 982 97d3ff546b26
permissions -rw-r--r--
Don't use the reduced type when choosing a swizzle.
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.
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    72
    struct SymbolScope *next;
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    73
} SymbolScope;
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    74
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    75
typedef struct SymbolMap
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    76
{
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    77
    HashTable *hash;
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    78
    SymbolScope *scope;
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    79
} SymbolMap;
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    80
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
    81
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    82
// 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
    83
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    84
typedef struct Context
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    85
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    86
    int isfail;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    87
    int out_of_memory;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    88
    MOJOSHADER_malloc malloc;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    89
    MOJOSHADER_free free;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    90
    void *malloc_data;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
    91
    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
    92
    ErrorList *warnings;
858
d51537335896 Formalized the compiler's string cache into a real API.
Ryan C. Gordon <icculus@icculus.org>
parents: 857
diff changeset
    93
    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
    94
    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
    95
    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
    96
    SymbolMap usertypes;
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
    97
    SymbolMap variables;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
    98
    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
    99
    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
   100
    int is_func_scope; // non-zero if semantic analysis is in function scope.
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 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
   102
    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
   103
    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
   104
    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
   105
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   106
    // 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
   107
    MOJOSHADER_astDataType dt_none;
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   108
    MOJOSHADER_astDataType dt_bool;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   109
    MOJOSHADER_astDataType dt_int;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   110
    MOJOSHADER_astDataType dt_uint;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   111
    MOJOSHADER_astDataType dt_float;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   112
    MOJOSHADER_astDataType dt_float_snorm;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   113
    MOJOSHADER_astDataType dt_float_unorm;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   114
    MOJOSHADER_astDataType dt_half;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   115
    MOJOSHADER_astDataType dt_double;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   116
    MOJOSHADER_astDataType dt_string;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   117
    MOJOSHADER_astDataType dt_sampler1d;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   118
    MOJOSHADER_astDataType dt_sampler2d;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   119
    MOJOSHADER_astDataType dt_sampler3d;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   120
    MOJOSHADER_astDataType dt_samplercube;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   121
    MOJOSHADER_astDataType dt_samplerstate;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   122
    MOJOSHADER_astDataType dt_samplercompstate;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   123
    MOJOSHADER_astDataType dt_buf_bool;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   124
    MOJOSHADER_astDataType dt_buf_int;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   125
    MOJOSHADER_astDataType dt_buf_uint;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   126
    MOJOSHADER_astDataType dt_buf_half;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   127
    MOJOSHADER_astDataType dt_buf_float;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   128
    MOJOSHADER_astDataType dt_buf_double;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   129
    MOJOSHADER_astDataType dt_buf_float_snorm;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   130
    MOJOSHADER_astDataType dt_buf_float_unorm;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   131
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   132
    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
   133
} Context;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   134
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   135
940
bc2a5efade5e Added a bunch of FIXMEs to accurately portray current technical debt.
Ryan C. Gordon <icculus@icculus.org>
parents: 939
diff changeset
   136
// !!! 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
   137
// !!! 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
   138
// !!! 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
   139
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   140
// Convenience functions for allocators...
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   141
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   142
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
   143
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   144
    ctx->isfail = ctx->out_of_memory = 1;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   145
} // out_of_memory
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
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
   148
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   149
    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
   150
    if (retval == NULL)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   151
        out_of_memory(ctx);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   152
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   153
} // Malloc
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   154
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   155
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
   156
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   157
    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
   158
    if (retval != NULL)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   159
        strcpy(retval, str);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   160
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   161
} // StrDup
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   162
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   163
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
   164
{
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   165
    ctx->free(ptr, ctx->malloc_data);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   166
} // Free
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
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
   169
{
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   170
    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
   171
} // MallocBridge
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
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
   174
{
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   175
    Free((Context *) data, ptr);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   176
} // FreeBridge
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   177
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   178
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
   179
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
   180
{
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   181
    ctx->isfail = 1;
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   182
    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
   183
        return;
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   184
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   185
    va_list ap;
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   186
    va_start(ap, fmt);
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   187
    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
   188
    va_end(ap);
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   189
} // failf
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   190
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   191
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
   192
{
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   193
    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
   194
} // fail
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   195
939
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   196
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
   197
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
   198
{
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   199
    if (ctx->out_of_memory)
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   200
        return;
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
    va_list ap;
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   203
    va_start(ap, fmt);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   204
    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
   205
    va_end(ap);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   206
} // warnf
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   207
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   208
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
   209
{
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   210
    warnf(ctx, "%s", reason);
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   211
} // warn
64cc93ee5a56 Cut-and-paste cleanup: unified the ErrorList functionality.
Ryan C. Gordon <icculus@icculus.org>
parents: 937
diff changeset
   212
932
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   213
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
   214
{
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   215
    return ctx->isfail;
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   216
} // isfail
079c62f868eb Filled in some stubs to flesh out the AST API.
Ryan C. Gordon <icculus@icculus.org>
parents: 931
diff changeset
   217
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   218
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   219
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
   220
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   221
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
   222
{
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   223
    // !!! 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
   224
    map->scope = NULL;
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   225
    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
   226
                            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
   227
    return (map->hash != NULL);
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   228
} // create_symbolmap
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   229
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   230
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
   231
                           const MOJOSHADER_astDataType *b)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   232
{
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   233
    int i;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   234
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   235
    if (a == b)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   236
        return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   237
    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
   238
        return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   239
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   240
    switch (a->type)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   241
    {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   242
        case MOJOSHADER_AST_DATATYPE_STRUCT:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   243
            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
   244
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   245
            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
   246
            {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   247
                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
   248
                                     b->structure.members[i].datatype))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   249
                    return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   250
                // 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
   251
                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
   252
                         b->structure.members[i].identifier)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   253
                    return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   254
            } // for
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   255
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   256
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   257
        case MOJOSHADER_AST_DATATYPE_ARRAY:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   258
            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
   259
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   260
            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
   261
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   262
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   263
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   264
        case MOJOSHADER_AST_DATATYPE_VECTOR:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   265
            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
   266
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   267
            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
   268
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   269
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   270
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   271
        case MOJOSHADER_AST_DATATYPE_MATRIX:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   272
            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
   273
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   274
            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
   275
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   276
            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
   277
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   278
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   279
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   280
        case MOJOSHADER_AST_DATATYPE_BUFFER:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   281
            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
   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_FUNCTION:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   284
            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
   285
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   286
            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
   287
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   288
            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
   289
                return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   290
            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
   291
            {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   292
                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
   293
                    return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   294
            } // for
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   295
            return 1;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   296
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   297
        case MOJOSHADER_AST_DATATYPE_USER:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   298
            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
   299
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   300
        default:
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   301
            assert(0 && "unexpected case");
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   302
            return 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   303
    } // switch
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   304
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
} // datatypes_match
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   307
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   308
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
   309
                        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
   310
                        const int check_dupes)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   311
{
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   312
    if (ctx->out_of_memory)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   313
        return;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   314
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   315
    // 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
   316
    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
   317
    const void *value = NULL;
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   318
    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
   319
    {
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   320
        // 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
   321
        // !!! 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
   322
        // !!! 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
   323
        item = map->scope;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   324
        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
   325
        {
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   326
            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
   327
            {
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   328
                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
   329
                return;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   330
            } // if
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   331
            item = item->next;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   332
        } // 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
   333
    } // if
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   334
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   335
    // 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
   336
    item = (SymbolScope *) Malloc(ctx, sizeof (SymbolScope));
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   337
    if (item == NULL)
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   338
        return;
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   339
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   340
    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
   341
    {
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   342
        if (hash_insert(map->hash, sym, item) == -1)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   343
        {
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   344
            Free(ctx, item);
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   345
            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
   346
        } // if
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   347
    } // if
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   348
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   349
    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
   350
    item->index = index;
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   351
    item->datatype = dt;
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   352
    item->next = map->scope;
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   353
    map->scope = item;
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   354
} // push_symbol
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   355
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   356
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
   357
{
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   358
    if (sym != NULL)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   359
    {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   360
        MOJOSHADER_astDataType *userdt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   361
        userdt = (MOJOSHADER_astDataType *) Malloc(ctx, sizeof (*userdt));
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   362
        if (userdt != 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
            // !!! FIXME: this is hacky.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   365
            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
   366
            {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   367
                Free(ctx, userdt);
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   368
                userdt = NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   369
            } // if
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
            userdt->type = MOJOSHADER_AST_DATATYPE_USER;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   372
            userdt->user.details = dt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   373
            userdt->user.name = sym;
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
            dt = userdt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   376
        } // if
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   377
    } // if
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   378
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   379
    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
   380
} // push_usertype
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   381
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   382
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
   383
{
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   384
    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
   385
    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
   386
    {
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   387
        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
   388
            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
   389
        else
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   390
            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
   391
    } // if
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   392
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   393
    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
   394
} // push_variable
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   395
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   396
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
   397
                          const MOJOSHADER_astDataType *dt,
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   398
                          const int just_declare)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   399
{
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   400
    // 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
   401
    //  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
   402
    assert(!ctx->is_func_scope);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   403
    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
   404
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   405
    int idx = 0;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   406
    if ((sym != NULL) && (dt != NULL))
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   407
    {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   408
        if (!dt->function.intrinsic)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   409
            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
   410
        else
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   411
            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
   412
    } // if
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   413
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   414
    // 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
   415
    //  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
   416
    //  see if it matches anything.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   417
    const void *value = NULL;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   418
    void *iter = NULL;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   419
    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
   420
    {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   421
        // 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
   422
        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
   423
        {
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   424
            if (!just_declare)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   425
                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
   426
            return;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   427
        } // if
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   428
    } // while
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   429
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   430
    // 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
   431
    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
   432
} // push_function
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   433
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   434
static inline void push_scope(Context *ctx)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   435
{
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   436
    push_usertype(ctx, NULL, NULL);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   437
    push_variable(ctx, NULL, NULL);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   438
} // push_scope
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   439
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   440
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
   441
{
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   442
    SymbolScope *item = map->scope;
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   443
    if (!item)
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   444
        return;
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   445
    if (item->symbol)
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   446
        hash_remove(map->hash, item->symbol);
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   447
    map->scope = item->next;
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   448
    Free(ctx, item);
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   449
} // pop_symbol
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   450
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   451
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
   452
{
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   453
    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
   454
        pop_symbol(ctx, map);
850
473108b0366d Fixed pop_scope().
Ryan C. Gordon <icculus@icculus.org>
parents: 849
diff changeset
   455
473108b0366d Fixed pop_scope().
Ryan C. Gordon <icculus@icculus.org>
parents: 849
diff changeset
   456
    assert(map->scope != NULL);
473108b0366d Fixed pop_scope().
Ryan C. Gordon <icculus@icculus.org>
parents: 849
diff changeset
   457
    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
   458
    pop_symbol(ctx, map);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   459
} // pop_symbol_scope
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   460
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   461
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
   462
{
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   463
    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
   464
    pop_symbol_scope(ctx, &ctx->variables);
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   465
} // push_scope
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   466
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   467
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
   468
{
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   469
    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
   470
    hash_find(map->hash, sym, &_item);
967
51ce9d8a7533 Fixed incorrect variable reference.
Ryan C. Gordon <icculus@icculus.org>
parents: 966
diff changeset
   471
    SymbolScope *item = (SymbolScope *) _item;
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   472
    if (item && _index)
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   473
        *_index = item->index;
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   474
    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
   475
} // 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
   476
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   477
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
   478
{
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   479
    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
   480
} // 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
   481
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
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
   483
{
966
9dd4107eed42 Semantic analysis now tries to assign a unique id to every variable.
Ryan C. Gordon <icculus@icculus.org>
parents: 964
diff changeset
   484
    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
   485
} // 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
   486
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   487
static void destroy_symbolmap(Context *ctx, SymbolMap *map)
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   488
{
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   489
    while (map->scope)
937
94e50ba3f956 Workaround for failing parse for now.
Ryan C. Gordon <icculus@icculus.org>
parents: 936
diff changeset
   490
        pop_symbol(ctx, map);
922
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   491
    hash_destroy(map->hash);
9b5879d36f36 Cleaned up UserTypeMap into a generic symbol tracker.
Ryan C. Gordon <icculus@icculus.org>
parents: 921
diff changeset
   492
} // destroy_symbolmap
846
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   493
10eb8be2c919 Added better (?) USERTYPE management.
Ryan C. Gordon <icculus@icculus.org>
parents: 845
diff changeset
   494
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   495
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
   496
                                            const MOJOSHADER_astDataType *dt,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   497
                                            const int columns)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   498
{
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   499
    MOJOSHADER_astDataType *retval;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   500
    retval = (MOJOSHADER_astDataType *) Malloc(ctx, sizeof (*retval));
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   501
    if (retval == NULL)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   502
        return NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   503
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   504
    // !!! FIXME: this is hacky.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   505
    // !!! 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
   506
    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
   507
    {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   508
        Free(ctx, retval);
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   509
        return NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   510
    } // if
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
    if ((columns < 1) || (columns > 4))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   513
        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
   514
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   515
    retval->type = MOJOSHADER_AST_DATATYPE_VECTOR;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   516
    retval->vector.base = dt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   517
    retval->vector.elements = columns;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   518
    return retval;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   519
} // new_datatype_vector
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   520
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   521
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
   522
                                            const MOJOSHADER_astDataType *dt,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   523
                                            const int rows, const int columns)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   524
{
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   525
    MOJOSHADER_astDataType *retval;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   526
    // !!! 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
   527
    retval = (MOJOSHADER_astDataType *) Malloc(ctx, sizeof (*retval));
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   528
    if (retval == NULL)
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   529
        return NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   530
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   531
    // !!! FIXME: this is hacky.
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   532
    // !!! 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
   533
    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
   534
    {
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   535
        Free(ctx, retval);
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   536
        return NULL;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   537
    } // if
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
    if ((rows < 1) || (rows > 4))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   540
        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
   541
    if ((columns < 1) || (columns > 4))
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   542
        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
   543
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   544
    retval->type = MOJOSHADER_AST_DATATYPE_MATRIX;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   545
    retval->matrix.base = dt;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   546
    retval->matrix.rows = rows;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   547
    retval->matrix.columns = columns;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   548
    return retval;
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   549
} // new_datatype_matrix
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   550
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
// !!! 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
   553
// !!! 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
   554
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   555
// 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
   556
//  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
   557
//  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
   558
//  afterwards.
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   559
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
   560
#define NEW_AST_NODE(retval, cls, typ) \
883
df6265a993bc Fixed C++ compiler error.
Ryan C. Gordon <icculus@icculus.org>
parents: 868
diff changeset
   561
    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
   562
    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
   563
        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
   564
        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
   565
        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
   566
        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
   567
    } while (0)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   568
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
   569
#define DELETE_AST_NODE(cls) do { \
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   570
    if (!cls) return; \
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   571
} while (0)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   572
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   573
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   574
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
   575
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
   576
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   577
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
   578
                                                     const char *string)
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   579
{
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   580
    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
   581
                 MOJOSHADER_AST_OP_IDENTIFIER);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   582
    retval->identifier = string;  // cached; don't copy string.
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   583
    return (MOJOSHADER_astExpression *) retval;
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   584
} // new_identifier_expr
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   585
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   586
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
   587
                                        const char *identifier,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   588
                                        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
   589
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   590
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionCallFunction,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   591
                 MOJOSHADER_AST_OP_CALLFUNC);
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   592
    MOJOSHADER_astExpression *expr = new_identifier_expr(ctx, identifier);
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   593
    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
   594
    retval->args = args;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   595
    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
   596
} // 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
   597
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   598
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
   599
                                            const MOJOSHADER_astDataType *dt,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   600
                                            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
   601
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   602
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionConstructor,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   603
                 MOJOSHADER_AST_OP_CONSTRUCTOR);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   604
    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
   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;
837
5f6528602658 Uncommented some grammar bits that got masked out in the calculator experiment.
Ryan C. Gordon <icculus@icculus.org>
parents: 836
diff changeset
   607
} // 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
   608
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   609
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
   610
                                            const MOJOSHADER_astDataType *dt,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   611
                                            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
   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_astExpressionCast, MOJOSHADER_AST_OP_CAST);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   614
    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
   615
    retval->operand = operand;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   616
    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
   617
} // 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
   618
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   619
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
   620
                                            const MOJOSHADER_astNodeType op,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   621
                                            MOJOSHADER_astExpression *operand)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   622
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   623
    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
   624
    assert(operator_is_unary(op));
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   625
    retval->operand = operand;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   626
    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
   627
} // new_unary_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   628
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   629
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
   630
                                            const MOJOSHADER_astNodeType op,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   631
                                            MOJOSHADER_astExpression *left,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   632
                                            MOJOSHADER_astExpression *right)
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_astExpressionBinary, 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_binary(op));
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   636
    retval->left = left;
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   637
    retval->right = right;
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_binary_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_ternary_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 *center,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   645
                                            MOJOSHADER_astExpression *right)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   646
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   647
    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
   648
    assert(operator_is_ternary(op));
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   649
    assert(op == MOJOSHADER_AST_OP_CONDITIONAL);
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   650
    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
   651
    retval->left = left;
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   652
    retval->center = center;
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   653
    retval->right = right;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   654
    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
   655
} // new_ternary_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   656
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   657
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
   658
                                        MOJOSHADER_astExpression *identifier,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   659
                                        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
   660
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   661
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionDerefStruct,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   662
                 MOJOSHADER_AST_OP_DEREF_STRUCT);
928
c9b0235e9d23 Made struct dereference a separate expression type, not a binary expression.
Ryan C. Gordon <icculus@icculus.org>
parents: 927
diff changeset
   663
    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
   664
    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
   665
    retval->isswizzle = 0;  // may change during semantic analysis.
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   666
    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
   667
} // 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
   668
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   669
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
   670
                                                       const int value)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   671
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   672
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionIntLiteral,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   673
                 MOJOSHADER_AST_OP_INT_LITERAL);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   674
    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
   675
    retval->value = value;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   676
    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
   677
} // new_literal_int_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   678
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   679
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
   680
                                                        const double dbl)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   681
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   682
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionFloatLiteral,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   683
                 MOJOSHADER_AST_OP_FLOAT_LITERAL);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   684
    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
   685
    retval->value = dbl;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   686
    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
   687
} // new_literal_float_expr
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   688
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   689
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
   690
                                                         const char *string)
827
2f955ce29b7b Moved the calculator experiment work back into the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 792
diff changeset
   691
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   692
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionStringLiteral,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   693
                 MOJOSHADER_AST_OP_STRING_LITERAL);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   694
    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
   695
    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
   696
    return (MOJOSHADER_astExpression *) retval;
924
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   697
} // new_literal_string_expr
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   698
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   699
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
   700
                                                          const int value)
924
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   701
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   702
    NEW_AST_NODE(retval, MOJOSHADER_astExpressionBooleanLiteral,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   703
                 MOJOSHADER_AST_OP_BOOLEAN_LITERAL);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   704
    retval->datatype = &ctx->dt_bool;
924
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   705
    retval->value = value;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   706
    return (MOJOSHADER_astExpression *) retval;
924
c99418745e1b Added boolean literals to parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 923
diff changeset
   707
} // 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
   708
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   709
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
   710
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   711
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
   712
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   713
    MOJOSHADER_astNode *expr = (MOJOSHADER_astNode *) _expr;
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   714
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   715
    DELETE_AST_NODE(expr);
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   716
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   717
    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
   718
        delete_expr(ctx, expr->cast.operand);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   719
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   720
    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
   721
        delete_arguments(ctx, expr->constructor.args);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   722
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   723
    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
   724
        delete_expr(ctx, expr->derefstruct.identifier);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   725
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   726
    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
   727
        delete_expr(ctx, expr->unary.operand);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   728
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
   729
    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
   730
    {
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   731
        delete_expr(ctx, expr->binary.left);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   732
        delete_expr(ctx, expr->binary.right);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   733
    } // else if
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   734
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
   735
    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
   736
    {
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   737
        delete_expr(ctx, expr->ternary.left);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   738
        delete_expr(ctx, expr->ternary.center);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   739
        delete_expr(ctx, expr->ternary.right);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   740
    } // else if
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   741
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   742
    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
   743
    {
973
6d4cdbc21301 Cleaned up the mess of function call processing.
Ryan C. Gordon <icculus@icculus.org>
parents: 972
diff changeset
   744
        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
   745
        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
   746
    } // else if
845
d10d31b9b695 Removed incorrect assertion.
Ryan C. Gordon <icculus@icculus.org>
parents: 844
diff changeset
   747
d10d31b9b695 Removed incorrect assertion.
Ryan C. Gordon <icculus@icculus.org>
parents: 844
diff changeset
   748
    // rest of operators don't have extra data to free.
d10d31b9b695 Removed incorrect assertion.
Ryan C. Gordon <icculus@icculus.org>
parents: 844
diff changeset
   749
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   750
    Free(ctx, expr);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   751
} // delete_expr
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   752
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   753
static MOJOSHADER_astArguments *new_argument(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   754
                                             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
   755
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   756
    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
   757
    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
   758
    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
   759
    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
   760
} // 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
   761
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   762
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
   763
{
0e8b7f053a45 Reworked AST to not use AST_OP_COMMA for function/constructor argument lists.
Ryan C. Gordon <icculus@icculus.org>
parents: 926
diff changeset
   764
    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
   765
    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
   766
    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
   767
    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
   768
} // 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
   769
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   770
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
   771
                        const MOJOSHADER_astInputModifier inputmod,
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   772
                        const MOJOSHADER_astDataType *dt,
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   773
                        const char *identifier, const char *semantic,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   774
                        const MOJOSHADER_astInterpolationModifier interpmod,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   775
                        MOJOSHADER_astExpression *initializer)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   776
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   777
    NEW_AST_NODE(retval, MOJOSHADER_astFunctionParameters,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   778
                 MOJOSHADER_AST_FUNCTION_PARAMS);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   779
    retval->datatype = dt;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   780
    retval->input_modifier = inputmod;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   781
    retval->identifier = identifier;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   782
    retval->semantic = semantic;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   783
    retval->interpolation_modifier = interpmod;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   784
    retval->initializer = initializer;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   785
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   786
    return retval;
926
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   787
} // new_function_param
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   788
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   789
static void delete_function_params(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   790
                                   MOJOSHADER_astFunctionParameters *params)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   791
{
926
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   792
    DELETE_AST_NODE(params);
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   793
    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
   794
    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
   795
    Free(ctx, params);
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   796
} // delete_function_params
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   797
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   798
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
   799
                                    const MOJOSHADER_astDataType *dt,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   800
                                    const char *identifier,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   801
                                    MOJOSHADER_astFunctionParameters *params)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   802
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   803
    NEW_AST_NODE(retval, MOJOSHADER_astFunctionSignature,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   804
                 MOJOSHADER_AST_FUNCTION_SIGNATURE);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   805
    retval->datatype = dt;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   806
    retval->identifier = identifier;
926
8ac335735b37 Renamed function "arguments" to function "parameters" in the AST.
Ryan C. Gordon <icculus@icculus.org>
parents: 925
diff changeset
   807
    retval->params = params;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   808
    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
   809
    retval->semantic = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   810
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   811
} // new_function_signature
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 void delete_function_signature(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   814
                                      MOJOSHADER_astFunctionSignature *sig)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   815
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   816
    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
   817
    delete_function_params(ctx, sig->params);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   818
    Free(ctx, sig);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   819
} // delete_function_signature
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   820
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   821
static MOJOSHADER_astCompilationUnit *new_function(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   822
                                MOJOSHADER_astFunctionSignature *declaration,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   823
                                MOJOSHADER_astStatement *definition)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   824
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   825
    NEW_AST_NODE(retval, MOJOSHADER_astCompilationUnitFunction,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   826
                 MOJOSHADER_AST_COMPUNIT_FUNCTION);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   827
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   828
    retval->declaration = declaration;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   829
    retval->definition = definition;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   830
    return (MOJOSHADER_astCompilationUnit *) retval;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   831
} // new_function
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   832
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   833
static void delete_function(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   834
                            MOJOSHADER_astCompilationUnitFunction *unitfn)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   835
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   836
    DELETE_AST_NODE(unitfn);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   837
    delete_compilation_unit(ctx, unitfn->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   838
    delete_function_signature(ctx, unitfn->declaration);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   839
    delete_statement(ctx, unitfn->definition);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   840
    Free(ctx, unitfn);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   841
} // delete_function
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   842
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   843
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
   844
                                          const char *ident, const int isvec,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   845
                                          MOJOSHADER_astExpression *dim)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   846
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   847
    NEW_AST_NODE(retval, MOJOSHADER_astScalarOrArray,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   848
                 MOJOSHADER_AST_SCALAR_OR_ARRAY);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   849
    retval->identifier = ident;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   850
    retval->isarray = isvec;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   851
    retval->dimension = dim;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   852
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   853
} // new_scalar_or_array
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   854
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   855
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
   856
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   857
    DELETE_AST_NODE(s);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   858
    delete_expr(ctx, s->dimension);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   859
    Free(ctx, s);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   860
} // delete_scalar_or_array
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
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
   863
                                          const MOJOSHADER_astDataType *dt,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   864
                                          MOJOSHADER_astScalarOrArray *soa)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   865
{
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
   866
    // 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
   867
    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
   868
    retval->datatype = dt;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   869
    retval->isconst = isconst;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   870
    retval->details = soa;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   871
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   872
} // new_typedef
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   873
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   874
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
   875
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   876
    DELETE_AST_NODE(td);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   877
    delete_scalar_or_array(ctx, td->details);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   878
    Free(ctx, td);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   879
} // delete_typedef
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   880
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   881
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
   882
                                                 const char *a, const char *b)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   883
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   884
    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
   885
    retval->ident1 = a;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   886
    retval->ident2 = b;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   887
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   888
} // new_pack_offset
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   889
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   890
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
   891
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   892
    DELETE_AST_NODE(o);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   893
    Free(ctx, o);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   894
} // delete_pack_offset
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_astVariableLowLevel *new_variable_lowlevel(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   897
                                               MOJOSHADER_astPackOffset *po,
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   898
                                               const char *reg)
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   899
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   900
    NEW_AST_NODE(retval, MOJOSHADER_astVariableLowLevel,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   901
                 MOJOSHADER_AST_VARIABLE_LOWLEVEL);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   902
    retval->packoffset = po;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   903
    retval->register_name = reg;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   904
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   905
} // new_variable_lowlevel
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   906
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   907
static void delete_variable_lowlevel(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   908
                                     MOJOSHADER_astVariableLowLevel *vll)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   909
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   910
    DELETE_AST_NODE(vll);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   911
    delete_pack_offset(ctx, vll->packoffset);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   912
    Free(ctx, vll);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   913
} // delete_variable_lowlevel
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
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
   916
                                        const MOJOSHADER_astDataType *dt,
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   917
                                        MOJOSHADER_astExpression *initializer)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   918
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   919
    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
   920
    retval->datatype = dt;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   921
    retval->initializer = initializer;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   922
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   923
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   924
} // new_annotation
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   925
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   926
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
   927
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   928
    DELETE_AST_NODE(annos);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   929
    delete_annotation(ctx, annos->next);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   930
    delete_expr(ctx, annos->initializer);
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   931
    Free(ctx, annos);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   932
} // delete_annotation
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
static MOJOSHADER_astVariableDeclaration *new_variable_declaration(
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   935
                            Context *ctx, MOJOSHADER_astScalarOrArray *soa,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   936
                            const char *semantic,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   937
                            MOJOSHADER_astAnnotations *annotations,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   938
                            MOJOSHADER_astExpression *init,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   939
                            MOJOSHADER_astVariableLowLevel *vll)
836
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
    NEW_AST_NODE(retval, MOJOSHADER_astVariableDeclaration,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   942
                 MOJOSHADER_AST_VARIABLE_DECLARATION);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   943
    retval->attributes = 0;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   944
    retval->anonymous_datatype = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   945
    retval->details = soa;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   946
    retval->semantic = semantic;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   947
    retval->annotations = annotations;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   948
    retval->initializer = init;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   949
    retval->lowlevel = vll;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   950
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   951
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   952
} // new_variable_declaration
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   953
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   954
static void delete_variable_declaration(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   955
                                        MOJOSHADER_astVariableDeclaration *dcl)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   956
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   957
    DELETE_AST_NODE(dcl);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   958
    delete_variable_declaration(ctx, dcl->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   959
    delete_scalar_or_array(ctx, dcl->details);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   960
    delete_annotation(ctx, dcl->annotations);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   961
    delete_expr(ctx, dcl->initializer);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   962
    delete_variable_lowlevel(ctx, dcl->lowlevel);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   963
    Free(ctx, dcl);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   964
} // delete_variable_declaration
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   965
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   966
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
   967
                                      MOJOSHADER_astVariableDeclaration *decl)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   968
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   969
    NEW_AST_NODE(retval, MOJOSHADER_astCompilationUnitVariable,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   970
                 MOJOSHADER_AST_COMPUNIT_VARIABLE);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   971
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   972
    retval->declaration = decl;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   973
    return (MOJOSHADER_astCompilationUnit *) retval;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   974
} // new_global_variable
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   975
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   976
static void delete_global_variable(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   977
                                   MOJOSHADER_astCompilationUnitVariable *var)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   978
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   979
    DELETE_AST_NODE(var);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   980
    delete_compilation_unit(ctx, var->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   981
    delete_variable_declaration(ctx, var->declaration);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   982
    Free(ctx, var);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   983
} // delete_global_variable
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
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
   986
                                                     MOJOSHADER_astTypedef *td)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   987
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   988
    NEW_AST_NODE(retval, MOJOSHADER_astCompilationUnitTypedef,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   989
                 MOJOSHADER_AST_COMPUNIT_TYPEDEF);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   990
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   991
    retval->type_info = td;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   992
    return (MOJOSHADER_astCompilationUnit *) retval;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   993
} // new_global_typedef
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   994
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   995
static void delete_global_typedef(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
   996
                                  MOJOSHADER_astCompilationUnitTypedef *unit)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   997
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   998
    DELETE_AST_NODE(unit);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
   999
    delete_compilation_unit(ctx, unit->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1000
    delete_typedef(ctx, unit->type_info);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1001
    Free(ctx, unit);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1002
} // delete_global_typedef
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
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
  1005
                                            MOJOSHADER_astScalarOrArray *soa,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1006
                                            const char *semantic)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1007
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1008
    NEW_AST_NODE(retval, MOJOSHADER_astStructMembers,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1009
                 MOJOSHADER_AST_STRUCT_MEMBER);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1010
    retval->semantic = semantic;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1011
    retval->details = soa;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1012
    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
  1013
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1014
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1015
} // new_struct_member
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1016
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1017
static void delete_struct_member(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1018
                                 MOJOSHADER_astStructMembers *member)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1019
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1020
    DELETE_AST_NODE(member);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1021
    delete_struct_member(ctx, member->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1022
    delete_scalar_or_array(ctx, member->details);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1023
    Free(ctx, member);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1024
} // delete_struct_member
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1025
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1026
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
  1027
                                        const char *name,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1028
                                        MOJOSHADER_astStructMembers *members)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1029
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1030
    NEW_AST_NODE(retval, MOJOSHADER_astStructDeclaration,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1031
                 MOJOSHADER_AST_STRUCT_DECLARATION);
964
e8c09c28162e Reworked datatype processing in the compiler.
Ryan C. Gordon <icculus@icculus.org>
parents: 958
diff changeset
  1032
    retval->datatype = NULL;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1033
    retval->name = name;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1034
    retval->members = members;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1035
    return retval;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1036
} // new_struct_declaration
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1037
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1038
static void delete_struct_declaration(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1039
                                      MOJOSHADER_astStructDeclaration *decl)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1040
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1041
    DELETE_AST_NODE(decl);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1042
    delete_struct_member(ctx, decl->members);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1043
    Free(ctx, decl);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1044
} // delete_struct_declaration
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1045
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1046
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
  1047
                                           MOJOSHADER_astStructDeclaration *sd)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1048
{
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1049
    NEW_AST_NODE(retval, MOJOSHADER_astCompilationUnitStruct,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1050
                 MOJOSHADER_AST_COMPUNIT_STRUCT);
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1051
    retval->next = NULL;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1052
    retval->struct_info = sd;
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1053
    return (MOJOSHADER_astCompilationUnit *) retval;
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1054
} // new_global_struct
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1055
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1056
static void delete_global_struct(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1057
                                 MOJOSHADER_astCompilationUnitStruct *unit)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1058
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1059
    DELETE_AST_NODE(unit);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1060
    delete_compilation_unit(ctx, unit->next);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1061
    delete_struct_declaration(ctx, unit->struct_info);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1062
    Free(ctx, unit);
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1063
} // delete_global_struct
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1064
931
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1065
static void delete_compilation_unit(Context *ctx,
4aa1f68d8292 Heavy rework of the AST code.
Ryan C. Gordon <icculus@icculus.org>
parents: 930
diff changeset
  1066
                                    MOJOSHADER_astCompilationUnit *unit)
836
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1067
{
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1068
    if (!unit) return;
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1069
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1070
    // it's important to not recurse too deeply here, since you may have
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1071
    //  thousands of items in this linked list (each line of a massive
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1072
    //  function, for example). To avoid this, we iterate the list here,
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1073
    //  deleting all children and making them think they have no reason
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1074
    //  to recurse in their own delete methods.
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordon <icculus@icculus.org>
parents: 835
diff changeset
  1075
    // Please note that everyone should _try_ to delete their "next" member,
d975fa785f1e Bunch More Work on HLSL parser.
Ryan C. Gordo&