Basic support for parsing and creating types from structure syntax.
1 /* vim: set ts=4 sw=4 tw=99 et:
3 * Copyright (C) 2012 David Anderson
5 * This file is part of SourcePawn.
7 * SourcePawn is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU General Public License as published by the Free
9 * Software Foundation, either version 3 of the License, or (at your option)
12 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
13 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License along with
17 * SourcePawn. If not, see http://www.gnu.org/licenses/.
19 #ifndef _include_jc_structure_h_
20 #define _include_jc_structure_h_
32 // When describing composite structures, the GC must be able to trace interior
33 // references to Objects. To make this possible, maps that describe composite
34 // structures must provide a list of offsets into their objects that are
35 // traceable. StructureBufferBuilder assists with this.
36 class StructureBufferBuilder
39 StructureBufferBuilder();
41 bool add(Handle<Type> type, unsigned *offset);
43 unsigned structureSize() const {
46 unsigned traceableOffsetCount() const {
47 return offsets_.length();
49 const unsigned *offsets() {
50 return offsets_.buffer();
54 Vector<unsigned> offsets_;
58 // Represents a property descriptor for a structure field.
59 class Descriptor : public Object
61 // The name of the field.
62 Barriered<String> name_;
64 // The type of the field.
65 Barriered<Type> type_;
67 // The offset into an object at which this field can be accessed.
71 static Descriptor *New(Zone *zone, Handle<String> name, Handle<Type> type,
84 // Begin GC descriptor.
85 static inline size_t offsetOfName() {
86 return OFFSETOF(Descriptor, name_);
88 static inline size_t offsetOfType() {
89 return OFFSETOF(Descriptor, type_);
93 static inline Descriptor *cast(Object *obj) {
94 assert(!obj || obj->is(MapKind_Descriptor));
95 return reinterpret_cast<Descriptor *>(obj);
101 #endif // _include_jc_structure_h_