dvander@0: /* dvander@0: * Copyright (C) 2012 David Anderson dvander@0: * dvander@0: * This file is part of JITCraft. dvander@0: * dvander@0: * JITCraft is free software: you can redistribute it and/or modify it under dvander@0: * the terms of the GNU General Public License as published by the Free dvander@0: * Software Foundation, either version 3 of the License, or (at your option) dvander@0: * any later version. dvander@0: * dvander@0: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@0: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@0: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@0: * dvander@0: * You should have received a copy of the GNU General Public License along with dvander@0: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@0: */ dvander@0: #ifndef _include_jc_types_h_ dvander@0: #define _include_jc_types_h_ dvander@0: dvander@0: #include "StringPool.h" dvander@11: #include "Heap.h" dvander@13: #include "Barriers.h" dvander@14: #include "FixedArray.h" dvander@0: dvander@0: namespace jc { dvander@0: dvander@0: enum PrimitiveType dvander@0: { dvander@21: PrimitiveType_Char, // signed, 8-bit character dvander@12: PrimitiveType_Int32, // signed, 32-bit integer dvander@12: PrimitiveType_Float, // 32-bit IEEE-754 float dvander@12: PrimitiveType_Native, // native-sized word dvander@11: PrimitiveTypes_Total dvander@0: }; dvander@0: dvander@12: class Type : public Object dvander@0: { dvander@0: enum Kind { dvander@0: PRIMITIVE, dvander@14: ARRAY, dvander@14: REFERENCE, dvander@21: FUNCTION dvander@0: }; dvander@0: dvander@11: private: dvander@11: Kind kind() { dvander@13: return kind_; dvander@11: } dvander@11: dvander@0: public: dvander@0: static const int UNKNOWN_SIZE = -1; dvander@0: static const size_t MAX_UNSAFE_ARRAY_DEPTH = 5; dvander@11: dvander@14: // :TODO: use handles dvander@11: static Type *NewPrimitive(Zone *zone, Name *tag); dvander@12: static Type *NewPrimitive(Zone *zone, PrimitiveType type); dvander@21: static Type *NewArray(Zone *zone, Type *contained, int elements, bool isConst); dvander@14: static Type *NewReference(Zone *zone, Type *contained); dvander@14: static Type *NewFunction(Zone *zone, Type *returnType, FixedArray *parameters); dvander@0: dvander@11: static Type *cast(Object *obj) { dvander@11: assert(obj->is(MapKind_Type)); dvander@11: return (Type *)obj; dvander@0: } dvander@11: dvander@11: bool isPrimitive() { dvander@11: return kind() == PRIMITIVE; dvander@11: } dvander@11: bool isArray() { dvander@14: return kind() == ARRAY; dvander@0: } dvander@14: bool isReference() { dvander@14: return kind() == REFERENCE; dvander@14: } dvander@14: bool isFunction() { dvander@14: return kind() == FUNCTION; dvander@0: } dvander@11: PrimitiveType primitive() { dvander@0: assert(isPrimitive()); dvander@13: return primitive_; dvander@0: } dvander@11: Type *contained() { dvander@14: assert(isArray() || isReference()); dvander@13: return Type::cast(contained_); dvander@0: } dvander@11: int elements() { dvander@0: assert(isArray()); dvander@13: return elements_; dvander@0: } dvander@11: unsigned levels() { dvander@0: assert(isArray()); dvander@13: return levels_; dvander@0: } dvander@11: Name *tag() { dvander@8: assert(isPrimitive()); dvander@13: return tag_; dvander@8: } dvander@11: Type *innermost() { dvander@0: assert(isArray()); dvander@0: Type *temp = contained(); dvander@0: while (temp->isArray()) dvander@0: temp = temp->contained(); dvander@0: return temp; dvander@0: } dvander@11: bool isFloat() { dvander@4: return isPrimitive() && primitive() == PrimitiveType_Float; dvander@4: } dvander@20: bool isInt32() { dvander@4: return isPrimitive() && primitive() == PrimitiveType_Int32; dvander@4: } dvander@21: bool isCharArray() { dvander@21: return isArray() && dvander@21: contained()->isPrimitive() && dvander@21: contained()->primitive() == PrimitiveType_Char; dvander@21: } dvander@21: bool isConst() { dvander@21: assert(isArray()); dvander@21: return const_; dvander@21: } dvander@14: Type *returnType() { dvander@14: assert(isFunction()); dvander@14: return returnType_; dvander@14: } dvander@14: FixedArray *parameters() { dvander@14: assert(isFunction()); dvander@14: return parameters_; dvander@14: } dvander@0: dvander@0: private: dvander@13: Kind kind_; dvander@13: PrimitiveType primitive_; dvander@13: Name *tag_; dvander@0: dvander@11: // Arrays only. dvander@13: int32 elements_; dvander@13: unsigned levels_; dvander@21: bool const_; dvander@14: dvander@14: // Arrays and references only. dvander@13: Barriered contained_; dvander@14: dvander@14: // Functions only. dvander@14: Barriered returnType_; dvander@14: Barriered parameters_; dvander@0: }; dvander@0: dvander@2: class BoxedPrimitive dvander@2: { dvander@2: PrimitiveType type_; dvander@2: union { dvander@2: int i_; dvander@2: }; dvander@2: dvander@2: public: dvander@2: static BoxedPrimitive Int(int i) { dvander@2: BoxedPrimitive b; dvander@2: b.type_ = PrimitiveType_Int32; dvander@2: b.i_ = i; dvander@2: return b; dvander@2: } dvander@2: dvander@2: PrimitiveType type() const { dvander@2: return type_; dvander@2: } dvander@2: int toInt() const { dvander@2: assert(type() == PrimitiveType_Int32); dvander@2: return i_; dvander@2: } dvander@2: }; dvander@2: dvander@0: } dvander@0: dvander@0: #endif // _include_jc_types_h_