src/SemanticAnalysis.cpp
changeset 146 dc7d3b7a918c
parent 145 e9d804821c48
child 147 9c544823d090
     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));