1.1 --- a/src/SemanticAnalysis.cpp Wed Aug 01 22:32:59 2012 -0700
1.2 +++ b/src/SemanticAnalysis.cpp Sat Aug 04 17:51:43 2012 -0700
1.3 @@ -159,6 +159,8 @@
1.4 return false;
1.5
1.6 enumstmt->decl()->setType(type);
1.7 + } else if (statement->isStructureStatement()) {
1.8 + statement->accept(this);
1.9 }
1.10 }
1.11
1.12 @@ -1208,6 +1210,50 @@
1.13 }
1.14
1.15 void
1.16 +SemanticAnalysis::visit(StructureStatement *node)
1.17 +{
1.18 + // If this node already has a type, it was pre-analyzed, so skip it.
1.19 + if (node->decl()->type())
1.20 + return;
1.21 +
1.22 + FieldList *fields = node->fields();
1.23 + Local<FixedArray> desctable(zone_, FixedArray::New(zone_, fields->length(), Heap::Tenure_Old));
1.24 + if (!desctable)
1.25 + return;
1.26 +
1.27 + StructureBufferBuilder builder;
1.28 +
1.29 + Local<Type> type(zone_);
1.30 + Local<String> name(zone_);
1.31 + Local<Descriptor> desc(zone_);
1.32 + for (size_t i = 0; i < fields->length(); i++) {
1.33 + StructureStatement::Field *field = fields->at(i);
1.34 +
1.35 + type = bindType(field->pos(), field->type());
1.36 + if (!type)
1.37 + return;
1.38 +
1.39 + unsigned offset;
1.40 + if (!builder.add(type, &offset))
1.41 + return;
1.42 +
1.43 + name = field->name();
1.44 + desc = Descriptor::New(zone_, name, type, offset);
1.45 + if (!desc)
1.46 + return;
1.47 +
1.48 + desctable->set(zone_, i, desc);
1.49 + }
1.50 +
1.51 + name = node->decl()->name();
1.52 + type = zone_->types()->newStruct(name, desctable);
1.53 + if (!type)
1.54 + return;
1.55 +
1.56 + node->decl()->setType(type);
1.57 +}
1.58 +
1.59 +void
1.60 SemanticAnalysis::visit(StringLiteral *node)
1.61 {
1.62 Local<Type> type(zone_, zone_->types()->getPrimitive(PrimitiveType_Char));