jitcraft/SemanticAnalysis.cpp
changeset 66 cbba1997dc71
parent 63 dd57743d220e
child 67 b765a6383849
     1.1 --- a/jitcraft/SemanticAnalysis.cpp	Mon Jul 09 01:22:03 2012 -0700
     1.2 +++ b/jitcraft/SemanticAnalysis.cpp	Mon Jul 09 21:40:20 2012 -0700
     1.3 @@ -542,9 +542,38 @@
     1.4          }
     1.5  
     1.6          if (parameter->reference()) {
     1.7 +            if (parameter->dimensions()) {
     1.8 +                cc_.reportError(parameter->variable()->pos(), Message_ArrayCantBeReference);
     1.9 +                return NULL;
    1.10 +            }
    1.11 +
    1.12              type = zone_->types()->getReference(type);
    1.13              if (!type)
    1.14                  return false;
    1.15 +        } else if (parameter->dimensions()) {
    1.16 +            if (parameter->dimensions()->length() > Type::MAX_UNSAFE_ARRAY_DEPTH) {
    1.17 +                cc_.reportError(node->pos(), Message_MaximumArrayDepth);
    1.18 +                return false;
    1.19 +            }
    1.20 +
    1.21 +            for (size_t i = parameter->dimensions()->length() - 1;
    1.22 +                 i < parameter->dimensions()->length();
    1.23 +                 i++)
    1.24 +            {
    1.25 +                int size = Type::UNKNOWN_SIZE;
    1.26 +                if (Expression *expr = parameter->dimensions()->at(i)) {
    1.27 +                    BoxedPrimitive box;
    1.28 +                    if (!EvaluateForConstant(expr, &box)) {
    1.29 +                        cc_.reportError(expr->pos(), Message_ArraySizeMustBeConstant);
    1.30 +                        return false;
    1.31 +                    }
    1.32 +                    size = box.toInt();
    1.33 +                }
    1.34 +
    1.35 +                type = Type::NewArray(zone_, type, size, false);
    1.36 +                if (!type)
    1.37 +                    return false;
    1.38 +            }
    1.39          }
    1.40  
    1.41          args->set(zone_, i, type);
    1.42 @@ -731,6 +760,8 @@
    1.43          if (actual->isReference() && !given->isReference())
    1.44              scope_->setUsesLifoHeap();
    1.45      }
    1.46 +
    1.47 +    node->setType(fun->type()->returnType());
    1.48  }
    1.49  
    1.50  void