dvander@146: /* vim: set ts=4 sw=4 tw=99 et: dvander@85: * dvander@85: * Copyright (C) 2012 David Anderson dvander@85: * dvander@146: * This file is part of SourcePawn. dvander@85: * dvander@146: * SourcePawn is free software: you can redistribute it and/or modify it under dvander@85: * the terms of the GNU General Public License as published by the Free dvander@85: * Software Foundation, either version 3 of the License, or (at your option) dvander@85: * any later version. dvander@85: * dvander@146: * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY dvander@85: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@85: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@85: * dvander@85: * You should have received a copy of the GNU General Public License along with dvander@146: * SourcePawn. If not, see http://www.gnu.org/licenses/. dvander@85: */ dvander@85: #include "Structures.h" dvander@146: #include "Zone.h" dvander@85: #include "Types.h" danderson@92: #include "Spaces-inl.h" danderson@92: #include "Heap-inl.h" dvander@85: dvander@85: using namespace ke; dvander@85: dvander@85: StructureBufferBuilder::StructureBufferBuilder() dvander@85: : size_(0) dvander@85: { dvander@85: } dvander@85: dvander@85: bool dvander@85: StructureBufferBuilder::add(Handle type, unsigned *offset) dvander@85: { dvander@85: *offset = size_; dvander@85: dvander@85: if (!type->isTraceable()) { dvander@85: // For now, assume the size of primitives is 4-byte. dvander@85: assert(type->isInt32() || type->isFloat()); dvander@85: size_ += 4; dvander@85: return true; dvander@85: } dvander@85: dvander@85: if (!offsets_.append(size_)) dvander@85: return false; dvander@85: dvander@85: size_ += sizeof(Object *); dvander@85: return true; dvander@85: } dvander@146: dvander@146: Descriptor * dvander@146: Descriptor::New(Zone *zone, Handle name, Handle type, unsigned offset) dvander@146: { dvander@146: Local desc(zone, dvander@146: Descriptor::cast(zone->allocate(MapKind_Descriptor, sizeof(Descriptor), Heap::Tenure_Old))); dvander@146: if (!desc) dvander@146: return NULL; dvander@146: dvander@146: desc->name_ = name; dvander@146: desc->type_ = type; dvander@146: desc->offset_ = offset; dvander@146: return desc; dvander@146: } dvander@146: