jitcraft/Types.h
author David Anderson <dvander@alliedmods.net>
Fri Jun 29 19:35:17 2012 -0700 (2012-06-29)
changeset 11 a350c2cc736a
parent 8 069d207a8f2a
child 12 75e385f68b7e
permissions -rw-r--r--
Imported garbage collection allocator and converted Type to a gc object.
dvander@0
     1
/*
dvander@0
     2
 * Copyright (C) 2012 David Anderson
dvander@0
     3
 *
dvander@0
     4
 * This file is part of JITCraft.
dvander@0
     5
 *
dvander@0
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     7
 * the terms of the GNU General Public License as published by the Free
dvander@0
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
     9
 * any later version.
dvander@0
    10
 * 
dvander@0
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    14
 *
dvander@0
    15
 * You should have received a copy of the GNU General Public License along with
dvander@0
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    17
 */
dvander@0
    18
#ifndef _include_jc_types_h_
dvander@0
    19
#define _include_jc_types_h_
dvander@0
    20
dvander@0
    21
#include "StringPool.h"
dvander@11
    22
#include "Heap.h"
dvander@0
    23
dvander@0
    24
namespace jc {
dvander@0
    25
dvander@0
    26
enum PrimitiveType
dvander@0
    27
{
dvander@4
    28
    PrimitiveType_Int32,
dvander@11
    29
    PrimitiveType_Float,
dvander@11
    30
    PrimitiveTypes_Total
dvander@0
    31
};
dvander@0
    32
dvander@11
    33
class Type : public GCObject
dvander@0
    34
{
dvander@0
    35
    enum Kind {
dvander@0
    36
        PRIMITIVE,
dvander@0
    37
        UNSAFE_ARRAY
dvander@0
    38
    };
dvander@0
    39
dvander@11
    40
  private:
dvander@11
    41
    void initPrimitive(Name *tag);
dvander@11
    42
    void initInlineArray(Type *contained, int elements);
dvander@11
    43
    Kind kind() {
dvander@11
    44
        return (Kind)READ_FIELD(kind);
dvander@11
    45
    }
dvander@11
    46
dvander@0
    47
  public:
dvander@0
    48
    static const int UNKNOWN_SIZE = -1;
dvander@0
    49
    static const size_t MAX_UNSAFE_ARRAY_DEPTH = 5;
dvander@11
    50
    
dvander@11
    51
    static Type *NewPrimitive(Zone *zone, Name *tag);
dvander@11
    52
    static Type *NewUnsafeArray(Zone *zone, Type *contained, int elements);
dvander@0
    53
dvander@11
    54
    static Type *cast(Object *obj) {
dvander@11
    55
        assert(obj->is(MapKind_Type));
dvander@11
    56
        return (Type *)obj;
dvander@0
    57
    }
dvander@11
    58
dvander@11
    59
    bool isPrimitive() {
dvander@11
    60
        return kind() == PRIMITIVE;
dvander@11
    61
    }
dvander@11
    62
    bool isArray() {
dvander@0
    63
        return isUnsafeArray();
dvander@0
    64
    }
dvander@11
    65
    bool isUnsafeArray() {
dvander@11
    66
        return kind() == UNSAFE_ARRAY;
dvander@0
    67
    }
dvander@11
    68
    PrimitiveType primitive() {
dvander@0
    69
        assert(isPrimitive());
dvander@11
    70
        return (PrimitiveType)READ_FIELD(primitive);
dvander@0
    71
    }
dvander@11
    72
    Type *contained() {
dvander@0
    73
        assert(isArray());
dvander@11
    74
        return Type::cast(READ_FIELD_OBJ(contained));
dvander@0
    75
    }
dvander@11
    76
    int elements() {
dvander@0
    77
        assert(isArray());
dvander@11
    78
        return READ_FIELD(elements);
dvander@0
    79
    }
dvander@11
    80
    unsigned levels() {
dvander@0
    81
        assert(isArray());
dvander@11
    82
        return READ_FIELD(levels);
dvander@0
    83
    }
dvander@11
    84
    Name *tag() {
dvander@8
    85
        assert(isPrimitive());
dvander@11
    86
        return (Name *)READ_FIELD(tag);
dvander@8
    87
    }
dvander@11
    88
    Type *innermost() {
dvander@0
    89
        assert(isArray());
dvander@0
    90
        Type *temp = contained();
dvander@0
    91
        while (temp->isArray())
dvander@0
    92
            temp = temp->contained();
dvander@0
    93
        return temp;
dvander@0
    94
    }
dvander@11
    95
    bool isFloat() {
dvander@4
    96
        return isPrimitive() && primitive() == PrimitiveType_Float;
dvander@4
    97
    }
dvander@11
    98
    bool isInt() {
dvander@4
    99
        return isPrimitive() && primitive() == PrimitiveType_Int32;
dvander@4
   100
    }
dvander@0
   101
dvander@0
   102
  private:
dvander@11
   103
    OBJECT_FIELD(uint8, kind);
dvander@0
   104
dvander@11
   105
    // Primitives only.
dvander@11
   106
    OBJECT_FIELD(uint8, primitive);
dvander@11
   107
    OBJECT_FIELD(CrapPtr, tag);
dvander@0
   108
dvander@11
   109
    // Arrays only.
dvander@11
   110
    OBJECT_FIELD(int32, elements);
dvander@11
   111
    OBJECT_FIELD(uint32, levels);
dvander@11
   112
    OBJECT_FIELD(Type *, contained);
dvander@0
   113
};
dvander@0
   114
dvander@2
   115
class BoxedPrimitive
dvander@2
   116
{
dvander@2
   117
    PrimitiveType type_;
dvander@2
   118
    union {
dvander@2
   119
        int i_;
dvander@2
   120
    };
dvander@2
   121
dvander@2
   122
  public:
dvander@2
   123
    static BoxedPrimitive Int(int i) {
dvander@2
   124
        BoxedPrimitive b;
dvander@2
   125
        b.type_ = PrimitiveType_Int32;
dvander@2
   126
        b.i_ = i;
dvander@2
   127
        return b;
dvander@2
   128
    }
dvander@2
   129
dvander@2
   130
    PrimitiveType type() const {
dvander@2
   131
        return type_;
dvander@2
   132
    }
dvander@2
   133
    int toInt() const {
dvander@2
   134
        assert(type() == PrimitiveType_Int32);
dvander@2
   135
        return i_;
dvander@2
   136
    }
dvander@2
   137
};
dvander@2
   138
dvander@0
   139
}
dvander@0
   140
dvander@0
   141
#endif // _include_jc_types_h_