24 StackLimitCheck stackLimitCheck(isolate);
25 if (stackLimitCheck.HasOverflowed() || (recursion_limit == 0)) {
29 if (subject->IsConsString()) {
35 recursion_limit).ToHandle(&new_first)) {
38 if (*found)
return isolate->
factory()->NewConsString(new_first, second);
43 .ToHandle(&new_second)) {
46 if (*found)
return isolate->
factory()->NewConsString(first, new_second);
51 if (index == -1)
return subject;
56 isolate, cons1, isolate->
factory()->NewConsString(first, replace),
59 isolate->
factory()->NewSubString(subject, index + 1, subject->length());
60 return isolate->
factory()->NewConsString(cons1, second);
67 DCHECK(args.length() == 3);
74 const int kRecursionLimit = 0x1000;
78 kRecursionLimit).ToHandle(&result)) {
81 if (isolate->has_pending_exception())
return isolate->heap()->exception();
94 DCHECK(args.length() == 3);
101 if (!index->ToArrayIndex(&start_index))
return Smi::FromInt(-1);
109 template <
typename s
char,
typename p
char>
112 int pattern_length = pattern.
length();
113 DCHECK(pattern_length >= 1);
116 if (
sizeof(schar) == 1 &&
sizeof(pchar) > 1) {
117 for (
int i = 0;
i < pattern_length;
i++) {
125 pchar pattern_first_char = pattern[0];
126 for (
int i = idx;
i >= 0;
i--) {
127 if (subject[
i] != pattern_first_char)
continue;
129 while (j < pattern_length) {
130 if (pattern[j] != subject[
i + j]) {
135 if (j == pattern_length) {
145 DCHECK(args.length() == 3);
152 if (!index->ToArrayIndex(&start_index))
return Smi::FromInt(-1);
154 uint32_t pat_length = pat->length();
155 uint32_t sub_length = sub->length();
157 if (start_index + pat_length > sub_length) {
158 start_index = sub_length - pat_length;
161 if (pat_length == 0) {
200 DCHECK(args.length() == 2);
206 int str1_length = str1->length();
207 int str2_length = str2->length();
210 if (str1_length == 0) {
217 int end = str1_length < str2_length ? str1_length : str2_length;
222 int d = str1->Get(0) - str2->Get(0);
232 for (
int i = 0;
i < end;
i++) {
244 DCHECK(args.length() == 3);
250 if (args[1]->IsSmi() && args[2]->IsSmi()) {
264 isolate->counters()->sub_string_runtime()->Increment();
266 return *isolate->factory()->NewSubString(
string, start, end);
272 DCHECK(args.length() == 2);
275 isolate->counters()->string_add_runtime()->Increment();
278 isolate, result, isolate->factory()->NewConsString(str1, str2));
287 return *isolate->factory()->InternalizeString(
string);
293 DCHECK(args.length() == 3);
302 if (global_cache.HasException())
return isolate->heap()->exception();
304 int capture_count = regexp->CaptureCount();
306 ZoneScope zone_scope(isolate->runtime_zone());
310 int32_t* match = global_cache.FetchNext();
311 if (match ==
NULL)
break;
312 offsets.
Add(match[0], zone_scope.
zone());
313 offsets.
Add(match[1], zone_scope.
zone());
316 if (global_cache.HasException())
return isolate->heap()->exception();
318 if (offsets.length() == 0) {
320 return isolate->heap()->null_value();
324 global_cache.LastSuccessfulMatch());
326 int matches = offsets.length() / 2;
329 isolate->factory()->NewSubString(subject, offsets.
at(0), offsets.
at(1));
330 elements->set(0, *substring);
331 for (
int i = 1;
i < matches;
i++) {
333 int from = offsets.
at(
i * 2);
334 int to = offsets.
at(
i * 2 + 1);
336 isolate->factory()->NewProperSubString(subject, from,
to);
337 elements->set(
i, *substring);
339 Handle<JSArray> result = isolate->factory()->NewJSArrayWithElements(elements);
347 DCHECK(args.length() == 2);
357 if (
i >=
static_cast<uint32_t>(subject->length())) {
358 return isolate->heap()->nan_value();
367 DCHECK(args.length() == 1);
368 if (args[0]->IsNumber()) {
371 return *isolate->factory()->LookupSingleCharacterStringFromCode(code);
373 return isolate->heap()->empty_string();
379 DCHECK(args.length() == 2);
384 isolate->counters()->string_compare_runtime()->Increment();
388 if (
y->length() == 0) {
391 }
else if (x->length() == 0) {
395 int d = x->Get(0) -
y->Get(0);
407 int prefix_length = x->length();
408 if (
y->length() < prefix_length) {
409 prefix_length =
y->length();
411 }
else if (
y->length() > prefix_length) {
438 result = equal_prefix_result;
448 DCHECK(args.length() == 3);
451 if (!args[1]->ToInt32(&array_length)) {
456 size_t actual_array_length = 0;
460 RUNTIME_ASSERT(
static_cast<size_t>(array_length) <= actual_array_length);
468 int special_length = special->length();
469 if (!array->HasFastObjectElements()) {
470 return isolate->Throw(isolate->heap()->illegal_argument_string());
474 bool one_byte = special->HasOnlyOneByteChars();
478 FixedArray* fixed_array = FixedArray::cast(array->elements());
479 if (fixed_array->
length() < array_length) {
480 array_length = fixed_array->
length();
483 if (array_length == 0) {
484 return isolate->heap()->empty_string();
485 }
else if (array_length == 1) {
487 if (first->IsString())
return first;
490 array_length, &one_byte);
494 return isolate->Throw(isolate->heap()->illegal_argument_string());
500 isolate, answer, isolate->factory()->NewRawOneByteString(length));
502 FixedArray::cast(array->elements()),
508 isolate, answer, isolate->factory()->NewRawTwoByteString(length));
510 FixedArray::cast(array->elements()),
519 DCHECK(args.length() == 3);
522 if (!args[1]->ToInt32(&array_length)) {
530 if (fixed_array->length() < array_length) {
531 array_length = fixed_array->length();
534 if (array_length == 0) {
535 return isolate->heap()->empty_string();
536 }
else if (array_length == 1) {
537 Object* first = fixed_array->get(0);
542 int separator_length = separator->length();
544 int max_nof_separators =
546 if (max_nof_separators < (array_length - 1)) {
549 int length = (array_length - 1) * separator_length;
550 for (
int i = 0;
i < array_length;
i++) {
551 Object* element_obj = fixed_array->get(
i);
553 String* element = String::cast(element_obj);
554 int increment = element->
length();
565 isolate, answer, isolate->factory()->NewRawTwoByteString(length));
569 uc16* sink = answer->GetChars();
571 uc16* end = sink + length;
575 String* first = String::cast(fixed_array->get(0));
576 String* separator_raw = *separator;
577 int first_length = first->
length();
579 sink += first_length;
581 for (
int i = 1;
i < array_length;
i++) {
582 DCHECK(sink + separator_length <= end);
584 sink += separator_length;
587 String* element = String::cast(fixed_array->get(
i));
588 int element_length = element->
length();
589 DCHECK(sink + element_length <= end);
591 sink += element_length;
596 DCHECK(!answer->IsOneByteRepresentation());
600 template <
typename Char>
607 int previous_separator_position = 0;
608 int separator_length = separator->
length();
610 for (
int i = 0;
i < elements_length;
i += 2) {
612 String*
string = String::cast(elements->
get(
i + 1));
613 int string_length =
string->length();
614 if (string->
length() > 0) {
615 while (previous_separator_position < position) {
616 String::WriteToFlat<Char>(separator, &buffer[cursor], 0,
618 cursor += separator_length;
619 previous_separator_position++;
621 String::WriteToFlat<Char>(
string, &buffer[cursor], 0, string_length);
622 cursor +=
string->length();
625 if (separator_length > 0) {
628 DCHECK(array_length <= 0x7fffffff);
629 int last_array_index =
static_cast<int>(array_length - 1);
630 while (previous_separator_position < last_array_index) {
631 String::WriteToFlat<Char>(separator, &buffer[cursor], 0,
633 cursor += separator_length;
634 previous_separator_position++;
643 DCHECK(args.length() == 3);
655 int string_length = 0;
656 bool is_one_byte = separator->IsOneByteRepresentation();
659 RUNTIME_ASSERT(elements_length <= elements_array->elements()->length());
661 FixedArray* elements = FixedArray::cast(elements_array->elements());
662 for (
int i = 0;
i < elements_length;
i += 2) {
671 for (
int i = 0;
i < elements_length;
i += 2) {
672 String*
string = String::cast(elements->
get(
i + 1));
673 int length =
string->length();
682 string_length += length;
686 int separator_length = separator->length();
687 if (!
overflow && separator_length > 0) {
688 if (array_length <= 0x7fffffffu) {
689 int separator_count =
static_cast<int>(array_length) - 1;
691 if ((remaining_length / separator_length) >= separator_count) {
692 string_length += separator_length * (array_length - 1);
713 ->NewRawOneByteString(string_length)
715 JoinSparseArrayWithSeparator<uint8_t>(
716 FixedArray::cast(elements_array->elements()), elements_length,
717 array_length, *separator,
722 ->NewRawTwoByteString(string_length)
724 JoinSparseArrayWithSeparator<uc16>(
725 FixedArray::cast(elements_array->elements()), elements_length,
726 array_length, *separator,
740 FixedArray* one_byte_cache = heap->single_character_string_cache();
741 Object* undefined = heap->undefined_value();
744 for (
i = 0;
i < length; ++
i) {
745 Object* value = one_byte_cache->
get(chars[
i]);
746 if (value == undefined)
break;
754 for (
int j = 0; j < length; ++j) {
757 (element->IsString() && String::cast(element)->LooksValid()));
768 DCHECK(args.length() == 2);
773 const int length =
static_cast<int>(Min<uint32_t>(s->length(), limit));
777 if (s->IsFlat() && s->IsOneByteRepresentation()) {
779 elements = isolate->factory()->NewUninitializedFixedArray(length);
790 MemsetPointer(elements->data_start(), isolate->heap()->undefined_value(),
794 elements = isolate->factory()->NewFixedArray(length);
796 for (
int i = position;
i < length; ++
i) {
798 isolate->factory()->LookupSingleCharacterStringFromCode(s->Get(
i));
799 elements->set(
i, *str);
803 for (
int i = 0;
i < length; ++
i) {
804 DCHECK(String::cast(elements->get(
i))->length() == 1);
808 return *isolate->factory()->NewJSArrayWithElements(elements);
815 static const uc32 yuml_code = 0xff;
816 static const uc32 micro_code = 0xb5;
817 return (character == yuml_code || character == micro_code);
821 template <
class Converter>
835 bool has_changed_character =
false;
844 bool ignore_overflow = Converter::kIsToLower || result->IsSeqTwoByteString();
845 for (
int i = 0;
i < result_length;) {
846 bool has_next = stream.
HasMore();
848 int char_length = mapping->
get(current, next, chars);
849 if (char_length == 0) {
851 result->
Set(
i, current);
853 }
else if (char_length == 1 &&
856 DCHECK(
static_cast<uc32>(chars[0]) != current);
857 result->
Set(
i, chars[0]);
858 has_changed_character =
true;
860 }
else if (result_length == string->
length()) {
875 next_length = mapping->
get(next, 0, chars);
876 if (next_length == 0) next_length = 1;
878 int current_length =
i + char_length + next_length;
886 int char_length = mapping->
get(current, 0, chars);
887 if (char_length == 0) char_length = 1;
888 current_length += char_length;
892 NewInvalidStringLengthError());
897 return (overflows && !ignore_overflow) ?
Smi::FromInt(-current_length)
900 for (
int j = 0; j < char_length; j++) {
901 result->
Set(
i, chars[j]);
904 has_changed_character =
true;
908 if (has_changed_character) {
943 static bool CheckFastAsciiConvert(
char* dst,
const char* src,
int length,
944 bool changed,
bool is_to_lower) {
945 bool expected_changed =
false;
946 for (
int i = 0;
i < length;
i++) {
947 if (dst[
i] == src[
i])
continue;
948 expected_changed =
true;
950 DCHECK(
'A' <= src[
i] && src[
i] <=
'Z');
951 DCHECK(dst[
i] == src[
i] + (
'a' -
'A'));
953 DCHECK(
'a' <= src[
i] && src[
i] <=
'z');
954 DCHECK(dst[
i] == src[
i] - (
'a' -
'A'));
957 return (expected_changed == changed);
962 template <
class Converter>
966 char* saved_dst = dst;
967 const char* saved_src = src;
972 DCHECK(
'a' -
'A' == (1 << 5));
974 static const char lo = Converter::kIsToLower ?
'A' - 1 :
'a' - 1;
975 static const char hi = Converter::kIsToLower ?
'Z' + 1 :
'z' + 1;
976 bool changed =
false;
978 const char*
const limit = src + length;
986 while (src <= limit -
sizeof(
uintptr_t)) {
999 while (src <= limit -
sizeof(
uintptr_t)) {
1006 *
reinterpret_cast<uintptr_t*
>(dst) = w ^ (m >> 2);
1013 while (src < limit) {
1016 if (
lo < c && c <
hi) {
1025 if ((or_acc &
kAsciiMask) != 0)
return false;
1027 DCHECK(CheckFastAsciiConvert(saved_dst, saved_src, length, changed,
1028 Converter::kIsToLower));
1030 *changed_out = changed;
1035 template <
class Converter>
1040 int length = s->length();
1042 if (length == 0)
return *s;
1050 if (s->IsOneByteRepresentationUnderneath()) {
1053 isolate->
factory()->NewRawOneByteString(length).ToHandleChecked();
1057 bool has_changed_character =
false;
1058 bool is_ascii = FastAsciiConvert<Converter>(
1059 reinterpret_cast<char*
>(result->GetChars()),
1060 reinterpret_cast<const char*
>(flat_content.
ToOneByteVector().start()),
1061 length, &has_changed_character);
1063 if (is_ascii)
return has_changed_character ? *result : *s;
1067 if (s->IsOneByteRepresentation()) {
1068 result = isolate->
factory()->NewRawOneByteString(length).ToHandleChecked();
1070 result = isolate->
factory()->NewRawTwoByteString(length).ToHandleChecked();
1074 if (answer->IsException() || answer->IsString())
return answer;
1077 length = Smi::cast(answer)->value();
1078 if (s->IsOneByteRepresentation() && length > 0) {
1080 isolate, result, isolate->
factory()->NewRawOneByteString(length));
1082 if (length < 0) length = -length;
1084 isolate, result, isolate->
factory()->NewRawTwoByteString(length));
1092 DCHECK(args.length() == 1);
1094 return ConvertCase(s, isolate, isolate->runtime_state()->to_lower_mapping());
1100 DCHECK(args.length() == 1);
1102 return ConvertCase(s, isolate, isolate->runtime_state()->to_upper_mapping());
1108 DCHECK(args.length() == 3);
1115 int length =
string->length();
1118 UnicodeCache* unicode_cache = isolate->unicode_cache();
1120 while (left < length &&
1135 return *isolate->factory()->NewSubString(
string, left, right);
1141 DCHECK(args.length() == 2);
1151 DCHECK(args.length() == 2);
1154 if (length == 0)
return isolate->heap()->empty_string();
1158 isolate, result, isolate->factory()->NewRawOneByteString(length));
1161 isolate, result, isolate->factory()->NewRawTwoByteString(length));
1169 DCHECK(args.length() == 2);
1187 DCHECK(args.length() == 1);
1194 SealHandleScope shs(isolate);
1195 return __RT_impl_Runtime_CharFromCode(args, isolate);
1200 SealHandleScope shs(isolate);
1201 DCHECK(args.length() == 2);
1204 if (std::isinf(args.number_at(1)))
return isolate->heap()->empty_string();
1205 Object* code = __RT_impl_Runtime_StringCharCodeAtRT(args, isolate);
1206 if (code->IsNaN())
return isolate->heap()->empty_string();
1207 return __RT_impl_Runtime_CharFromCode(
Arguments(1, &code), isolate);
1212 SealHandleScope shs(isolate);
1213 DCHECK(args.length() == 3);
1217 string->SeqOneByteStringSet(index, value);
1223 SealHandleScope shs(isolate);
1224 DCHECK(args.length() == 3);
1228 string->SeqTwoByteStringSet(index, value);
1234 SealHandleScope shs(isolate);
1235 return __RT_impl_Runtime_StringCompare(args, isolate);
1240 SealHandleScope shs(isolate);
1241 DCHECK(args.length() == 2);
1242 if (!args[0]->IsString())
return isolate->heap()->undefined_value();
1243 if (!args[1]->IsNumber())
return isolate->heap()->undefined_value();
1244 if (std::isinf(args.number_at(1)))
return isolate->heap()->nan_value();
1245 return __RT_impl_Runtime_StringCharCodeAtRT(args, isolate);
1250 SealHandleScope shs(isolate);
1251 return __RT_impl_Runtime_SubString(args, isolate);
1256 SealHandleScope shs(isolate);
1257 return __RT_impl_Runtime_StringAdd(args, isolate);
int get(uchar c, uchar n, uchar *result)
A JavaScript value representing a 32-bit signed integer.
A JavaScript value representing a 32-bit unsigned integer.
void set(int index, Object *value)
WriteBarrierMode GetWriteBarrierMode(const DisallowHeapAllocation &promise)
RuntimeState * runtime_state()
static void EnsureCanContainHeapObjectElements(Handle< JSObject > obj)
void Add(const T &element, AllocationPolicy allocator=AllocationPolicy())
static Handle< JSArray > SetLastMatchInfo(Handle< JSArray > last_match_info, Handle< String > subject, int capture_count, int32_t *match)
StaticResource< ConsStringIteratorOp > * string_iterator()
static int StringMatch(Isolate *isolate, Handle< String > sub, Handle< String > pat, int index)
static MUST_USE_RESULT Handle< String > Truncate(Handle< SeqString > string, int new_length)
static const int kMaxValue
static Smi * FromInt(int value)
Vector< const uint8_t > ToOneByteVector()
Vector< const uc16 > ToUC16Vector()
static void WriteToFlat(String *source, sinkchar *sink, int from, int to)
static const int32_t kMaxOneByteCharCode
static const int kMaxLength
bool IsOneByteRepresentation() const
static Handle< String > Flatten(Handle< String > string, PretenureFlag pretenure=NOT_TENURED)
void Set(int index, uint16_t value)
bool Equals(String *other)
bool IsWhiteSpaceOrLineTerminator(unibrow::uchar c)
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be expose gc extension under the specified name show built in functions in stack traces use random jit cookie to mask large constants minimum length for automatic enable preparsing CPU profiler sampling interval in microseconds trace out of bounds accesses to external arrays default size of stack region v8 is allowed to maximum length of function source code printed in a stack trace min size of a semi the new space consists of two semi spaces print one trace line following each garbage collection do not print trace line after scavenger collection print cumulative GC statistics in only print modified registers Trace simulator debug messages Implied by trace sim abort randomize hashes to avoid predictable hash Fixed seed to use to hash property Print the time it takes to deserialize the snapshot A filename with extra code to be included in the A file to write the raw snapshot bytes to(mksnapshot only)") DEFINE_STRING(raw_context_file
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long mode(MIPS only)") DEFINE_BOOL(enable_always_align_csp
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be NULL
#define ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, dst, call)
#define THROW_NEW_ERROR_RETURN_FAILURE(isolate, call)
#define ASSIGN_RETURN_ON_EXCEPTION(isolate, dst, call, T)
#define DCHECK(condition)
static int CopyCachedOneByteCharsToArray(Heap *heap, const uint8_t *chars, FixedArray *elements, int length)
static MUST_USE_RESULT Object * ConvertCase(Handle< String > s, Isolate *isolate, unibrow::Mapping< Converter, 128 > *mapping)
const uintptr_t kUintptrAllBitsSet
static void StringBuilderConcatHelper(String *special, sinkchar *sink, FixedArray *fixed_array, int array_length)
int CompareChars(const lchar *lhs, const rchar *rhs, int chars)
static const uintptr_t kAsciiMask
static bool FastAsciiConvert(char *dst, const char *src, int length, bool *changed_out)
static int StringMatchBackwards(Vector< const schar > subject, Vector< const pchar > pattern, int idx)
void MemsetPointer(T **dest, U *value, int counter)
static uintptr_t AsciiRangeMask(uintptr_t w, char m, char n)
int32_t NumberToInt32(Object *number)
static MUST_USE_RESULT Object * ConvertCaseHelper(Isolate *isolate, String *string, SeqString *result, int result_length, unibrow::Mapping< Converter, 128 > *mapping)
static void JoinSparseArrayWithSeparator(FixedArray *elements, int elements_length, uint32_t array_length, String *separator, Vector< Char > buffer)
STATIC_ASSERT(sizeof(CPURegister)==sizeof(Register))
MaybeHandle< String > StringReplaceOneCharWithString(Isolate *isolate, Handle< String > subject, Handle< String > search, Handle< String > replace, bool *found, int recursion_limit)
static bool ToUpperOverflows(uc32 character)
bool TryNumberToSize(Isolate *isolate, Object *number, size_t *result)
bool IsAligned(T value, U alignment)
int FastD2IChecked(double x)
static int StringBuilderConcatLength(int special_length, FixedArray *fixed_array, int array_length, bool *one_byte)
static const uintptr_t kOneInEveryByte
Debugger support for the V8 JavaScript engine.
#define CONVERT_BOOLEAN_ARG_CHECKED(name, index)
#define CONVERT_ARG_CHECKED(Type, name, index)
#define RUNTIME_ASSERT(value)
#define CONVERT_ARG_HANDLE_CHECKED(Type, name, index)
#define CONVERT_NUMBER_CHECKED(type, name, Type, obj)
#define CONVERT_DOUBLE_ARG_CHECKED(name, index)
#define CONVERT_INT32_ARG_CHECKED(name, index)
#define CONVERT_SMI_ARG_CHECKED(name, index)