| Index: runtime/lib/string.cc
|
| ===================================================================
|
| --- runtime/lib/string.cc (revision 28056)
|
| +++ runtime/lib/string.cc (working copy)
|
| @@ -214,12 +214,44 @@
|
| }
|
|
|
|
|
| -DEFINE_NATIVE_ENTRY(Strings_concatAll, 1) {
|
| - GET_NON_NULL_NATIVE_ARGUMENT(Array, strings, arguments->NativeArgAt(0));
|
| - ASSERT(!strings.IsNull());
|
| +DEFINE_NATIVE_ENTRY(Strings_concatAll, 3) {
|
| + GET_NON_NULL_NATIVE_ARGUMENT(Instance, argument, arguments->NativeArgAt(0));
|
| + GET_NON_NULL_NATIVE_ARGUMENT(Smi, start, arguments->NativeArgAt(1));
|
| + GET_NON_NULL_NATIVE_ARGUMENT(Smi, end, arguments->NativeArgAt(2));
|
| + const intptr_t start_ix = start.Value();
|
| + const intptr_t end_ix = end.Value();
|
| + if (start_ix < 0) {
|
| + const Array& args = Array::Handle(Array::New(1));
|
| + args.SetAt(0, start);
|
| + Exceptions::ThrowByType(Exceptions::kArgument, args);
|
| + }
|
| + Array& strings = Array::Handle();
|
| + if (argument.IsArray()) {
|
| + strings ^= argument.raw();
|
| + if (end_ix > strings.Length()) {
|
| + const Array& args = Array::Handle(Array::New(1));
|
| + args.SetAt(0, end);
|
| + Exceptions::ThrowByType(Exceptions::kArgument, args);
|
| + }
|
| + } else if (argument.IsGrowableObjectArray()) {
|
| + // Allocate new array and copy data into it.
|
| + GrowableObjectArray& g = GrowableObjectArray::Handle();
|
| + g ^= argument.raw();
|
| + strings = g.data();
|
| + if (end_ix > g.Length()) {
|
| + const Array& args = Array::Handle(Array::New(1));
|
| + args.SetAt(0, end);
|
| + Exceptions::ThrowByType(Exceptions::kArgument, args);
|
| + }
|
| + } else {
|
| + const Array& args = Array::Handle(Array::New(1));
|
| + args.SetAt(0, argument);
|
| + Exceptions::ThrowByType(Exceptions::kArgument, args);
|
| + }
|
| +#if defined(DEBUG)
|
| // Check that the array contains strings.
|
| Instance& elem = Instance::Handle();
|
| - for (intptr_t i = 0; i < strings.Length(); i++) {
|
| + for (intptr_t i = start_ix; i < end_ix; i++) {
|
| elem ^= strings.At(i);
|
| if (!elem.IsString()) {
|
| const Array& args = Array::Handle(Array::New(1));
|
| @@ -227,7 +259,8 @@
|
| Exceptions::ThrowByType(Exceptions::kArgument, args);
|
| }
|
| }
|
| - return String::ConcatAll(strings);
|
| +#endif
|
| + return String::ConcatAllRange(strings, start_ix, end_ix, Heap::kNew);
|
| }
|
|
|
|
|
|
|