diff -r 7c942b5adebc -r cbba1997dc71 jitcraft/SemanticAnalysis.cpp --- a/jitcraft/SemanticAnalysis.cpp Mon Jul 09 01:22:03 2012 -0700 +++ b/jitcraft/SemanticAnalysis.cpp Mon Jul 09 21:40:20 2012 -0700 @@ -542,9 +542,38 @@ } if (parameter->reference()) { + if (parameter->dimensions()) { + cc_.reportError(parameter->variable()->pos(), Message_ArrayCantBeReference); + return NULL; + } + type = zone_->types()->getReference(type); if (!type) return false; + } else if (parameter->dimensions()) { + if (parameter->dimensions()->length() > Type::MAX_UNSAFE_ARRAY_DEPTH) { + cc_.reportError(node->pos(), Message_MaximumArrayDepth); + return false; + } + + for (size_t i = parameter->dimensions()->length() - 1; + i < parameter->dimensions()->length(); + i++) + { + int size = Type::UNKNOWN_SIZE; + if (Expression *expr = parameter->dimensions()->at(i)) { + BoxedPrimitive box; + if (!EvaluateForConstant(expr, &box)) { + cc_.reportError(expr->pos(), Message_ArraySizeMustBeConstant); + return false; + } + size = box.toInt(); + } + + type = Type::NewArray(zone_, type, size, false); + if (!type) + return false; + } } args->set(zone_, i, type); @@ -731,6 +760,8 @@ if (actual->isReference() && !given->isReference()) scope_->setUsesLifoHeap(); } + + node->setType(fun->type()->returnType()); } void