Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1)

Side by Side Diff: src/runtime.cc

Issue 9395075: Cleaned up runtime macros a bit. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 namespace v8 { 62 namespace v8 {
63 namespace internal { 63 namespace internal {
64 64
65 65
66 #define RUNTIME_ASSERT(value) \ 66 #define RUNTIME_ASSERT(value) \
67 if (!(value)) return isolate->ThrowIllegalOperation(); 67 if (!(value)) return isolate->ThrowIllegalOperation();
68 68
69 // Cast the given object to a value of the specified type and store 69 // Cast the given object to a value of the specified type and store
70 // it in a variable with the given name. If the object is not of the 70 // it in a variable with the given name. If the object is not of the
71 // expected type call IllegalOperation and return. 71 // expected type call IllegalOperation and return.
72 #define CONVERT_CHECKED(Type, name, obj) \ 72 #define CONVERT_CHECKED(Type, name, index) \
Jakob Kummerow 2012/02/20 17:31:47 Now that there's so little difference between CONV
Sven Panne 2012/02/21 07:21:01 I am not 100% sure if we can really handlify every
73 RUNTIME_ASSERT(obj->Is##Type()); \ 73 RUNTIME_ASSERT(args[index]->Is##Type()); \
74 Type* name = Type::cast(obj); 74 Type* name = Type::cast(args[index]);
75 75
76 #define CONVERT_ARG_CHECKED(Type, name, index) \ 76 #define CONVERT_ARG_CHECKED(Type, name, index) \
77 RUNTIME_ASSERT(args[index]->Is##Type()); \ 77 RUNTIME_ASSERT(args[index]->Is##Type()); \
78 Handle<Type> name = args.at<Type>(index); 78 Handle<Type> name = args.at<Type>(index);
79 79
80 // Cast the given object to a boolean and store it in a variable with 80 // Cast the given object to a boolean and store it in a variable with
81 // the given name. If the object is not a boolean call IllegalOperation 81 // the given name. If the object is not a boolean call IllegalOperation
82 // and return. 82 // and return.
83 #define CONVERT_BOOLEAN_CHECKED(name, obj) \ 83 #define CONVERT_BOOLEAN_CHECKED(name, index) \
84 RUNTIME_ASSERT(obj->IsBoolean()); \ 84 RUNTIME_ASSERT(args[index]->IsBoolean()); \
85 bool name = (obj)->IsTrue(); 85 bool name = args[index]->IsTrue();
86 86
87 // Cast the given argument to a Smi and store its value in an int variable 87 // Cast the given argument to a Smi and store its value in an int variable
88 // with the given name. If the argument is not a Smi call IllegalOperation 88 // with the given name. If the argument is not a Smi call IllegalOperation
89 // and return. 89 // and return.
90 #define CONVERT_SMI_ARG_CHECKED(name, index) \ 90 #define CONVERT_SMI_ARG_CHECKED(name, index) \
91 RUNTIME_ASSERT(args[index]->IsSmi()); \ 91 RUNTIME_ASSERT(args[index]->IsSmi()); \
92 int name = args.smi_at(index); 92 int name = args.smi_at(index);
93 93
94 // Cast the given argument to a double and store it in a variable with 94 // Cast the given argument to a double and store it in a variable with
95 // the given name. If the argument is not a number (as opposed to 95 // the given name. If the argument is not a number (as opposed to
96 // the number not-a-number) call IllegalOperation and return. 96 // the number not-a-number) call IllegalOperation and return.
97 #define CONVERT_DOUBLE_ARG_CHECKED(name, index) \ 97 #define CONVERT_DOUBLE_ARG_CHECKED(name, index) \
98 RUNTIME_ASSERT(args[index]->IsNumber()); \ 98 RUNTIME_ASSERT(args[index]->IsNumber()); \
99 double name = args.number_at(index); 99 double name = args.number_at(index);
100 100
101 // Call the specified converter on the object *comand store the result in 101 // Call the specified converter on the object *comand store the result in
102 // a variable of the specified type with the given name. If the 102 // a variable of the specified type with the given name. If the
103 // object is not a Number call IllegalOperation and return. 103 // object is not a Number call IllegalOperation and return.
104 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \ 104 #define CONVERT_NUMBER_CHECKED(type, name, Type, obj) \
105 RUNTIME_ASSERT(obj->IsNumber()); \ 105 RUNTIME_ASSERT(obj->IsNumber()); \
106 type name = NumberTo##Type(obj); 106 type name = NumberTo##Type(obj);
107 107
108 108
109 // Cast the given argument to PropertyDetails and store its value in a
110 // variable with the given name. If the argument is not a Smi call
111 // IllegalOperation and return.
112 #define CONVERT_PROPERTY_DETAILS_CHECKED(name, index) \
113 RUNTIME_ASSERT(args[index]->IsSmi()); \
114 PropertyDetails name = PropertyDetails(Smi::cast(args[index]));
115
116
109 // Assert that the given argument has a valid value for a StrictModeFlag 117 // Assert that the given argument has a valid value for a StrictModeFlag
110 // and store it in a StrictModeFlag variable with the given name. 118 // and store it in a StrictModeFlag variable with the given name.
111 #define CONVERT_STRICT_MODE_ARG(name, index) \ 119 #define CONVERT_STRICT_MODE_ARG(name, index) \
112 ASSERT(args[index]->IsSmi()); \ 120 RUNTIME_ASSERT(args[index]->IsSmi()); \
113 ASSERT(args.smi_at(index) == kStrictMode || \ 121 RUNTIME_ASSERT(args.smi_at(index) == kStrictMode || \
114 args.smi_at(index) == kNonStrictMode); \ 122 args.smi_at(index) == kNonStrictMode); \
115 StrictModeFlag name = \ 123 StrictModeFlag name = \
116 static_cast<StrictModeFlag>(args.smi_at(index)); 124 static_cast<StrictModeFlag>(args.smi_at(index));
117 125
118 126
119 // Assert that the given argument has a valid value for a LanguageMode 127 // Assert that the given argument has a valid value for a LanguageMode
120 // and store it in a LanguageMode variable with the given name. 128 // and store it in a LanguageMode variable with the given name.
121 #define CONVERT_LANGUAGE_MODE_ARG(name, index) \ 129 #define CONVERT_LANGUAGE_MODE_ARG(name, index) \
122 ASSERT(args[index]->IsSmi()); \ 130 ASSERT(args[index]->IsSmi()); \
Jakob Kummerow 2012/02/20 17:31:47 RUNTIME_ASSERT here, too?
Sven Panne 2012/02/21 07:21:01 This is what initially thought, too, but the funct
123 ASSERT(args.smi_at(index) == CLASSIC_MODE || \ 131 ASSERT(args.smi_at(index) == CLASSIC_MODE || \
124 args.smi_at(index) == STRICT_MODE || \ 132 args.smi_at(index) == STRICT_MODE || \
125 args.smi_at(index) == EXTENDED_MODE); \ 133 args.smi_at(index) == EXTENDED_MODE); \
126 LanguageMode name = \ 134 LanguageMode name = \
127 static_cast<LanguageMode>(args.smi_at(index)); 135 static_cast<LanguageMode>(args.smi_at(index));
128 136
129 137
130 MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate, 138 MUST_USE_RESULT static MaybeObject* DeepCopyBoilerplate(Isolate* isolate,
131 JSObject* boilerplate) { 139 JSObject* boilerplate) {
132 StackLimitCheck check(isolate); 140 StackLimitCheck check(isolate);
(...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after
684 692
685 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSFunctionProxy) { 693 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsJSFunctionProxy) {
686 ASSERT(args.length() == 1); 694 ASSERT(args.length() == 1);
687 Object* obj = args[0]; 695 Object* obj = args[0];
688 return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy()); 696 return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy());
689 } 697 }
690 698
691 699
692 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHandler) { 700 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetHandler) {
693 ASSERT(args.length() == 1); 701 ASSERT(args.length() == 1);
694 CONVERT_CHECKED(JSProxy, proxy, args[0]); 702 CONVERT_CHECKED(JSProxy, proxy, 0);
695 return proxy->handler(); 703 return proxy->handler();
696 } 704 }
697 705
698 706
699 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetCallTrap) { 707 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetCallTrap) {
700 ASSERT(args.length() == 1); 708 ASSERT(args.length() == 1);
701 CONVERT_CHECKED(JSFunctionProxy, proxy, args[0]); 709 CONVERT_CHECKED(JSFunctionProxy, proxy, 0);
702 return proxy->call_trap(); 710 return proxy->call_trap();
703 } 711 }
704 712
705 713
706 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructTrap) { 714 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetConstructTrap) {
707 ASSERT(args.length() == 1); 715 ASSERT(args.length() == 1);
708 CONVERT_CHECKED(JSFunctionProxy, proxy, args[0]); 716 CONVERT_CHECKED(JSFunctionProxy, proxy, 0);
709 return proxy->construct_trap(); 717 return proxy->construct_trap();
710 } 718 }
711 719
712 720
713 RUNTIME_FUNCTION(MaybeObject*, Runtime_Fix) { 721 RUNTIME_FUNCTION(MaybeObject*, Runtime_Fix) {
714 ASSERT(args.length() == 1); 722 ASSERT(args.length() == 1);
715 CONVERT_CHECKED(JSProxy, proxy, args[0]); 723 CONVERT_CHECKED(JSProxy, proxy, 0);
716 proxy->Fix(); 724 proxy->Fix();
717 return isolate->heap()->undefined_value(); 725 return isolate->heap()->undefined_value();
718 } 726 }
719 727
720 728
721 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetInitialize) { 729 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetInitialize) {
722 HandleScope scope(isolate); 730 HandleScope scope(isolate);
723 ASSERT(args.length() == 1); 731 ASSERT(args.length() == 1);
724 CONVERT_ARG_CHECKED(JSSet, holder, 0); 732 CONVERT_ARG_CHECKED(JSSet, holder, 0);
725 Handle<ObjectHashSet> table = isolate->factory()->NewObjectHashSet(0); 733 Handle<ObjectHashSet> table = isolate->factory()->NewObjectHashSet(0);
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 ASSERT(args.length() == 1); 841 ASSERT(args.length() == 1);
834 Object* obj = args[0]; 842 Object* obj = args[0];
835 if (!obj->IsJSObject()) return isolate->heap()->null_value(); 843 if (!obj->IsJSObject()) return isolate->heap()->null_value();
836 return JSObject::cast(obj)->class_name(); 844 return JSObject::cast(obj)->class_name();
837 } 845 }
838 846
839 847
840 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPrototype) { 848 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPrototype) {
841 NoHandleAllocation ha; 849 NoHandleAllocation ha;
842 ASSERT(args.length() == 1); 850 ASSERT(args.length() == 1);
843 CONVERT_CHECKED(JSReceiver, input_obj, args[0]); 851 CONVERT_CHECKED(JSReceiver, input_obj, 0);
844 Object* obj = input_obj; 852 Object* obj = input_obj;
845 // We don't expect access checks to be needed on JSProxy objects. 853 // We don't expect access checks to be needed on JSProxy objects.
846 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); 854 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject());
847 do { 855 do {
848 if (obj->IsAccessCheckNeeded() && 856 if (obj->IsAccessCheckNeeded() &&
849 !isolate->MayNamedAccess(JSObject::cast(obj), 857 !isolate->MayNamedAccess(JSObject::cast(obj),
850 isolate->heap()->Proto_symbol(), 858 isolate->heap()->Proto_symbol(),
851 v8::ACCESS_GET)) { 859 v8::ACCESS_GET)) {
852 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET); 860 isolate->ReportFailedAccessCheck(JSObject::cast(obj), v8::ACCESS_GET);
853 return isolate->heap()->undefined_value(); 861 return isolate->heap()->undefined_value();
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
1140 } 1148 }
1141 elms->set(VALUE_INDEX, value); 1149 elms->set(VALUE_INDEX, value);
1142 } 1150 }
1143 1151
1144 return *desc; 1152 return *desc;
1145 } 1153 }
1146 1154
1147 1155
1148 RUNTIME_FUNCTION(MaybeObject*, Runtime_PreventExtensions) { 1156 RUNTIME_FUNCTION(MaybeObject*, Runtime_PreventExtensions) {
1149 ASSERT(args.length() == 1); 1157 ASSERT(args.length() == 1);
1150 CONVERT_CHECKED(JSObject, obj, args[0]); 1158 CONVERT_CHECKED(JSObject, obj, 0);
1151 return obj->PreventExtensions(); 1159 return obj->PreventExtensions();
1152 } 1160 }
1153 1161
1154 1162
1155 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsExtensible) { 1163 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsExtensible) {
1156 ASSERT(args.length() == 1); 1164 ASSERT(args.length() == 1);
1157 CONVERT_CHECKED(JSObject, obj, args[0]); 1165 CONVERT_CHECKED(JSObject, obj, 0);
1158 if (obj->IsJSGlobalProxy()) { 1166 if (obj->IsJSGlobalProxy()) {
1159 Object* proto = obj->GetPrototype(); 1167 Object* proto = obj->GetPrototype();
1160 if (proto->IsNull()) return isolate->heap()->false_value(); 1168 if (proto->IsNull()) return isolate->heap()->false_value();
1161 ASSERT(proto->IsJSGlobalObject()); 1169 ASSERT(proto->IsJSGlobalObject());
1162 obj = JSObject::cast(proto); 1170 obj = JSObject::cast(proto);
1163 } 1171 }
1164 return isolate->heap()->ToBoolean(obj->map()->is_extensible()); 1172 return isolate->heap()->ToBoolean(obj->map()->is_extensible());
1165 } 1173 }
1166 1174
1167 1175
(...skipping 20 matching lines...) Expand all
1188 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsTemplate) { 1196 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsTemplate) {
1189 ASSERT(args.length() == 1); 1197 ASSERT(args.length() == 1);
1190 Object* arg = args[0]; 1198 Object* arg = args[0];
1191 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo(); 1199 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo();
1192 return isolate->heap()->ToBoolean(result); 1200 return isolate->heap()->ToBoolean(result);
1193 } 1201 }
1194 1202
1195 1203
1196 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) { 1204 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetTemplateField) {
1197 ASSERT(args.length() == 2); 1205 ASSERT(args.length() == 2);
1198 CONVERT_CHECKED(HeapObject, templ, args[0]); 1206 CONVERT_CHECKED(HeapObject, templ, 0);
1199 CONVERT_CHECKED(Smi, field, args[1]); 1207 CONVERT_SMI_ARG_CHECKED(index, 1)
1200 int index = field->value();
1201 int offset = index * kPointerSize + HeapObject::kHeaderSize; 1208 int offset = index * kPointerSize + HeapObject::kHeaderSize;
1202 InstanceType type = templ->map()->instance_type(); 1209 InstanceType type = templ->map()->instance_type();
1203 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE || 1210 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE ||
1204 type == OBJECT_TEMPLATE_INFO_TYPE); 1211 type == OBJECT_TEMPLATE_INFO_TYPE);
1205 RUNTIME_ASSERT(offset > 0); 1212 RUNTIME_ASSERT(offset > 0);
1206 if (type == FUNCTION_TEMPLATE_INFO_TYPE) { 1213 if (type == FUNCTION_TEMPLATE_INFO_TYPE) {
1207 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize); 1214 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize);
1208 } else { 1215 } else {
1209 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize); 1216 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize);
1210 } 1217 }
1211 return *HeapObject::RawField(templ, offset); 1218 return *HeapObject::RawField(templ, offset);
1212 } 1219 }
1213 1220
1214 1221
1215 RUNTIME_FUNCTION(MaybeObject*, Runtime_DisableAccessChecks) { 1222 RUNTIME_FUNCTION(MaybeObject*, Runtime_DisableAccessChecks) {
1216 ASSERT(args.length() == 1); 1223 ASSERT(args.length() == 1);
1217 CONVERT_CHECKED(HeapObject, object, args[0]); 1224 CONVERT_CHECKED(HeapObject, object, 0);
1218 Map* old_map = object->map(); 1225 Map* old_map = object->map();
1219 bool needs_access_checks = old_map->is_access_check_needed(); 1226 bool needs_access_checks = old_map->is_access_check_needed();
1220 if (needs_access_checks) { 1227 if (needs_access_checks) {
1221 // Copy map so it won't interfere constructor's initial map. 1228 // Copy map so it won't interfere constructor's initial map.
1222 Object* new_map; 1229 Object* new_map;
1223 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions(); 1230 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions();
1224 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; 1231 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
1225 } 1232 }
1226 1233
1227 Map::cast(new_map)->set_is_access_check_needed(false); 1234 Map::cast(new_map)->set_is_access_check_needed(false);
1228 object->set_map(Map::cast(new_map)); 1235 object->set_map(Map::cast(new_map));
1229 } 1236 }
1230 return isolate->heap()->ToBoolean(needs_access_checks); 1237 return isolate->heap()->ToBoolean(needs_access_checks);
1231 } 1238 }
1232 1239
1233 1240
1234 RUNTIME_FUNCTION(MaybeObject*, Runtime_EnableAccessChecks) { 1241 RUNTIME_FUNCTION(MaybeObject*, Runtime_EnableAccessChecks) {
1235 ASSERT(args.length() == 1); 1242 ASSERT(args.length() == 1);
1236 CONVERT_CHECKED(HeapObject, object, args[0]); 1243 CONVERT_CHECKED(HeapObject, object, 0);
1237 Map* old_map = object->map(); 1244 Map* old_map = object->map();
1238 if (!old_map->is_access_check_needed()) { 1245 if (!old_map->is_access_check_needed()) {
1239 // Copy map so it won't interfere constructor's initial map. 1246 // Copy map so it won't interfere constructor's initial map.
1240 Object* new_map; 1247 Object* new_map;
1241 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions(); 1248 { MaybeObject* maybe_new_map = old_map->CopyDropTransitions();
1242 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map; 1249 if (!maybe_new_map->ToObject(&new_map)) return maybe_new_map;
1243 } 1250 }
1244 1251
1245 Map::cast(new_map)->set_is_access_check_needed(true); 1252 Map::cast(new_map)->set_is_access_check_needed(true);
1246 object->set_map(Map::cast(new_map)); 1253 object->set_map(Map::cast(new_map));
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after
1762 // Write in-object properties after the length of the array. 1769 // Write in-object properties after the length of the array.
1763 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]); 1770 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, args[1]);
1764 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]); 1771 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, args[2]);
1765 return array; 1772 return array;
1766 } 1773 }
1767 1774
1768 1775
1769 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) { 1776 RUNTIME_FUNCTION(MaybeObject*, Runtime_RegExpInitializeObject) {
1770 AssertNoAllocation no_alloc; 1777 AssertNoAllocation no_alloc;
1771 ASSERT(args.length() == 5); 1778 ASSERT(args.length() == 5);
1772 CONVERT_CHECKED(JSRegExp, regexp, args[0]); 1779 CONVERT_CHECKED(JSRegExp, regexp, 0);
1773 CONVERT_CHECKED(String, source, args[1]); 1780 CONVERT_CHECKED(String, source, 1);
1774 1781
1775 Object* global = args[2]; 1782 Object* global = args[2];
1776 if (!global->IsTrue()) global = isolate->heap()->false_value(); 1783 if (!global->IsTrue()) global = isolate->heap()->false_value();
1777 1784
1778 Object* ignoreCase = args[3]; 1785 Object* ignoreCase = args[3];
1779 if (!ignoreCase->IsTrue()) ignoreCase = isolate->heap()->false_value(); 1786 if (!ignoreCase->IsTrue()) ignoreCase = isolate->heap()->false_value();
1780 1787
1781 Object* multiline = args[4]; 1788 Object* multiline = args[4];
1782 if (!multiline->IsTrue()) multiline = isolate->heap()->false_value(); 1789 if (!multiline->IsTrue()) multiline = isolate->heap()->false_value();
1783 1790
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1876 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice); 1883 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice);
1877 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice); 1884 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice);
1878 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat); 1885 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat);
1879 1886
1880 return *holder; 1887 return *holder;
1881 } 1888 }
1882 1889
1883 1890
1884 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) { 1891 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetDefaultReceiver) {
1885 ASSERT(args.length() == 1); 1892 ASSERT(args.length() == 1);
1886 CONVERT_CHECKED(JSReceiver, callable, args[0]); 1893 CONVERT_CHECKED(JSReceiver, callable, 0);
1887 1894
1888 if (!callable->IsJSFunction()) { 1895 if (!callable->IsJSFunction()) {
1889 HandleScope scope(isolate); 1896 HandleScope scope(isolate);
1890 bool threw = false; 1897 bool threw = false;
1891 Handle<Object> delegate = 1898 Handle<Object> delegate =
1892 Execution::TryGetFunctionDelegate(Handle<JSReceiver>(callable), &threw); 1899 Execution::TryGetFunctionDelegate(Handle<JSReceiver>(callable), &threw);
1893 if (threw) return Failure::Exception(); 1900 if (threw) return Failure::Exception();
1894 callable = JSFunction::cast(*delegate); 1901 callable = JSFunction::cast(*delegate);
1895 } 1902 }
1896 JSFunction* function = JSFunction::cast(callable); 1903 JSFunction* function = JSFunction::cast(callable);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1935 } 1942 }
1936 literals->set(index, *regexp); 1943 literals->set(index, *regexp);
1937 return *regexp; 1944 return *regexp;
1938 } 1945 }
1939 1946
1940 1947
1941 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) { 1948 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetName) {
1942 NoHandleAllocation ha; 1949 NoHandleAllocation ha;
1943 ASSERT(args.length() == 1); 1950 ASSERT(args.length() == 1);
1944 1951
1945 CONVERT_CHECKED(JSFunction, f, args[0]); 1952 CONVERT_CHECKED(JSFunction, f, 0);
1946 return f->shared()->name(); 1953 return f->shared()->name();
1947 } 1954 }
1948 1955
1949 1956
1950 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetName) { 1957 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetName) {
1951 NoHandleAllocation ha; 1958 NoHandleAllocation ha;
1952 ASSERT(args.length() == 2); 1959 ASSERT(args.length() == 2);
1953 1960
1954 CONVERT_CHECKED(JSFunction, f, args[0]); 1961 CONVERT_CHECKED(JSFunction, f, 0);
1955 CONVERT_CHECKED(String, name, args[1]); 1962 CONVERT_CHECKED(String, name, 1);
1956 f->shared()->set_name(name); 1963 f->shared()->set_name(name);
1957 return isolate->heap()->undefined_value(); 1964 return isolate->heap()->undefined_value();
1958 } 1965 }
1959 1966
1960 1967
1961 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionNameShouldPrintAsAnonymous) { 1968 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionNameShouldPrintAsAnonymous) {
1962 NoHandleAllocation ha; 1969 NoHandleAllocation ha;
1963 ASSERT(args.length() == 1); 1970 ASSERT(args.length() == 1);
1964 CONVERT_CHECKED(JSFunction, f, args[0]); 1971 CONVERT_CHECKED(JSFunction, f, 0);
1965 return isolate->heap()->ToBoolean( 1972 return isolate->heap()->ToBoolean(
1966 f->shared()->name_should_print_as_anonymous()); 1973 f->shared()->name_should_print_as_anonymous());
1967 } 1974 }
1968 1975
1969 1976
1970 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionMarkNameShouldPrintAsAnonymous) { 1977 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionMarkNameShouldPrintAsAnonymous) {
1971 NoHandleAllocation ha; 1978 NoHandleAllocation ha;
1972 ASSERT(args.length() == 1); 1979 ASSERT(args.length() == 1);
1973 CONVERT_CHECKED(JSFunction, f, args[0]); 1980 CONVERT_CHECKED(JSFunction, f, 0);
1974 f->shared()->set_name_should_print_as_anonymous(true); 1981 f->shared()->set_name_should_print_as_anonymous(true);
1975 return isolate->heap()->undefined_value(); 1982 return isolate->heap()->undefined_value();
1976 } 1983 }
1977 1984
1978 1985
1979 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) { 1986 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionRemovePrototype) {
1980 NoHandleAllocation ha; 1987 NoHandleAllocation ha;
1981 ASSERT(args.length() == 1); 1988 ASSERT(args.length() == 1);
1982 1989
1983 CONVERT_CHECKED(JSFunction, f, args[0]); 1990 CONVERT_CHECKED(JSFunction, f, 0);
1984 Object* obj = f->RemovePrototype(); 1991 Object* obj = f->RemovePrototype();
1985 if (obj->IsFailure()) return obj; 1992 if (obj->IsFailure()) return obj;
1986 1993
1987 return isolate->heap()->undefined_value(); 1994 return isolate->heap()->undefined_value();
1988 } 1995 }
1989 1996
1990 1997
1991 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) { 1998 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScript) {
1992 HandleScope scope(isolate); 1999 HandleScope scope(isolate);
1993 ASSERT(args.length() == 1); 2000 ASSERT(args.length() == 1);
1994 2001
1995 CONVERT_CHECKED(JSFunction, fun, args[0]); 2002 CONVERT_CHECKED(JSFunction, fun, 0);
1996 Handle<Object> script = Handle<Object>(fun->shared()->script(), isolate); 2003 Handle<Object> script = Handle<Object>(fun->shared()->script(), isolate);
1997 if (!script->IsScript()) return isolate->heap()->undefined_value(); 2004 if (!script->IsScript()) return isolate->heap()->undefined_value();
1998 2005
1999 return *GetScriptWrapper(Handle<Script>::cast(script)); 2006 return *GetScriptWrapper(Handle<Script>::cast(script));
2000 } 2007 }
2001 2008
2002 2009
2003 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetSourceCode) { 2010 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetSourceCode) {
2004 HandleScope scope(isolate); 2011 HandleScope scope(isolate);
2005 ASSERT(args.length() == 1); 2012 ASSERT(args.length() == 1);
2006 2013
2007 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2014 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2008 Handle<SharedFunctionInfo> shared(f->shared()); 2015 Handle<SharedFunctionInfo> shared(f->shared());
2009 return *shared->GetSourceCode(); 2016 return *shared->GetSourceCode();
2010 } 2017 }
2011 2018
2012 2019
2013 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScriptSourcePosition) { 2020 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetScriptSourcePosition) {
2014 NoHandleAllocation ha; 2021 NoHandleAllocation ha;
2015 ASSERT(args.length() == 1); 2022 ASSERT(args.length() == 1);
2016 2023
2017 CONVERT_CHECKED(JSFunction, fun, args[0]); 2024 CONVERT_CHECKED(JSFunction, fun, 0);
2018 int pos = fun->shared()->start_position(); 2025 int pos = fun->shared()->start_position();
2019 return Smi::FromInt(pos); 2026 return Smi::FromInt(pos);
2020 } 2027 }
2021 2028
2022 2029
2023 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetPositionForOffset) { 2030 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetPositionForOffset) {
2024 ASSERT(args.length() == 2); 2031 ASSERT(args.length() == 2);
2025 2032
2026 CONVERT_CHECKED(Code, code, args[0]); 2033 CONVERT_CHECKED(Code, code, 0);
2027 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]); 2034 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]);
2028 2035
2029 RUNTIME_ASSERT(0 <= offset && offset < code->Size()); 2036 RUNTIME_ASSERT(0 <= offset && offset < code->Size());
2030 2037
2031 Address pc = code->address() + offset; 2038 Address pc = code->address() + offset;
2032 return Smi::FromInt(code->SourcePosition(pc)); 2039 return Smi::FromInt(code->SourcePosition(pc));
2033 } 2040 }
2034 2041
2035 2042
2036 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetInstanceClassName) { 2043 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetInstanceClassName) {
2037 NoHandleAllocation ha; 2044 NoHandleAllocation ha;
2038 ASSERT(args.length() == 2); 2045 ASSERT(args.length() == 2);
2039 2046
2040 CONVERT_CHECKED(JSFunction, fun, args[0]); 2047 CONVERT_CHECKED(JSFunction, fun, 0);
2041 CONVERT_CHECKED(String, name, args[1]); 2048 CONVERT_CHECKED(String, name, 1);
2042 fun->SetInstanceClassName(name); 2049 fun->SetInstanceClassName(name);
2043 return isolate->heap()->undefined_value(); 2050 return isolate->heap()->undefined_value();
2044 } 2051 }
2045 2052
2046 2053
2047 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetLength) { 2054 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetLength) {
2048 NoHandleAllocation ha; 2055 NoHandleAllocation ha;
2049 ASSERT(args.length() == 2); 2056 ASSERT(args.length() == 2);
2050 2057
2051 CONVERT_CHECKED(JSFunction, fun, args[0]); 2058 CONVERT_CHECKED(JSFunction, fun, 0);
2052 CONVERT_CHECKED(Smi, length, args[1]); 2059 CONVERT_SMI_ARG_CHECKED(length, 1);
2053 fun->shared()->set_length(length->value()); 2060 fun->shared()->set_length(length);
2054 return length; 2061 return fun;
Jakob Kummerow 2012/02/20 17:31:47 Is this change intentional?
Sven Panne 2012/02/21 07:21:01 Yep, it is just our usual ultra-confusing way of s
2055 } 2062 }
2056 2063
2057 2064
2058 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetPrototype) { 2065 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetPrototype) {
2059 NoHandleAllocation ha; 2066 NoHandleAllocation ha;
2060 ASSERT(args.length() == 2); 2067 ASSERT(args.length() == 2);
2061 2068
2062 CONVERT_CHECKED(JSFunction, fun, args[0]); 2069 CONVERT_CHECKED(JSFunction, fun, 0);
2063 ASSERT(fun->should_have_prototype()); 2070 ASSERT(fun->should_have_prototype());
2064 Object* obj; 2071 Object* obj;
2065 { MaybeObject* maybe_obj = 2072 { MaybeObject* maybe_obj =
2066 Accessors::FunctionSetPrototype(fun, args[1], NULL); 2073 Accessors::FunctionSetPrototype(fun, args[1], NULL);
2067 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 2074 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
2068 } 2075 }
2069 return args[0]; // return TOS 2076 return args[0]; // return TOS
2070 } 2077 }
2071 2078
2072 2079
2073 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) { 2080 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionSetReadOnlyPrototype) {
2074 NoHandleAllocation ha; 2081 NoHandleAllocation ha;
2075 RUNTIME_ASSERT(args.length() == 1); 2082 RUNTIME_ASSERT(args.length() == 1);
2076 CONVERT_CHECKED(JSFunction, function, args[0]); 2083 CONVERT_CHECKED(JSFunction, function, 0);
2077 2084
2078 MaybeObject* maybe_name = 2085 MaybeObject* maybe_name =
2079 isolate->heap()->AllocateStringFromAscii(CStrVector("prototype")); 2086 isolate->heap()->AllocateStringFromAscii(CStrVector("prototype"));
2080 String* name; 2087 String* name;
2081 if (!maybe_name->To(&name)) return maybe_name; 2088 if (!maybe_name->To(&name)) return maybe_name;
2082 2089
2083 if (function->HasFastProperties()) { 2090 if (function->HasFastProperties()) {
2084 // Construct a new field descriptor with updated attributes. 2091 // Construct a new field descriptor with updated attributes.
2085 DescriptorArray* instance_desc = function->map()->instance_descriptors(); 2092 DescriptorArray* instance_desc = function->map()->instance_descriptors();
2086 int index = instance_desc->Search(name); 2093 int index = instance_desc->Search(name);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2122 function->property_dictionary()->DetailsAtPut(entry, new_details); 2129 function->property_dictionary()->DetailsAtPut(entry, new_details);
2123 } 2130 }
2124 return function; 2131 return function;
2125 } 2132 }
2126 2133
2127 2134
2128 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsAPIFunction) { 2135 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsAPIFunction) {
2129 NoHandleAllocation ha; 2136 NoHandleAllocation ha;
2130 ASSERT(args.length() == 1); 2137 ASSERT(args.length() == 1);
2131 2138
2132 CONVERT_CHECKED(JSFunction, f, args[0]); 2139 CONVERT_CHECKED(JSFunction, f, 0);
2133 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction()); 2140 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction());
2134 } 2141 }
2135 2142
2136 2143
2137 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsBuiltin) { 2144 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionIsBuiltin) {
2138 NoHandleAllocation ha; 2145 NoHandleAllocation ha;
2139 ASSERT(args.length() == 1); 2146 ASSERT(args.length() == 1);
2140 2147
2141 CONVERT_CHECKED(JSFunction, f, args[0]); 2148 CONVERT_CHECKED(JSFunction, f, 0);
2142 return isolate->heap()->ToBoolean(f->IsBuiltin()); 2149 return isolate->heap()->ToBoolean(f->IsBuiltin());
2143 } 2150 }
2144 2151
2145 2152
2146 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetCode) { 2153 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetCode) {
2147 HandleScope scope(isolate); 2154 HandleScope scope(isolate);
2148 ASSERT(args.length() == 2); 2155 ASSERT(args.length() == 2);
2149 2156
2150 CONVERT_ARG_CHECKED(JSFunction, target, 0); 2157 CONVERT_ARG_CHECKED(JSFunction, target, 0);
2151 Handle<Object> code = args.at<Object>(1); 2158 Handle<Object> code = args.at<Object>(1);
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
2228 } 2235 }
2229 } 2236 }
2230 return isolate->heap()->empty_string(); 2237 return isolate->heap()->empty_string();
2231 } 2238 }
2232 2239
2233 2240
2234 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) { 2241 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCharCodeAt) {
2235 NoHandleAllocation ha; 2242 NoHandleAllocation ha;
2236 ASSERT(args.length() == 2); 2243 ASSERT(args.length() == 2);
2237 2244
2238 CONVERT_CHECKED(String, subject, args[0]); 2245 CONVERT_CHECKED(String, subject, 0);
2239 Object* index = args[1]; 2246 Object* index = args[1];
2240 RUNTIME_ASSERT(index->IsNumber()); 2247 RUNTIME_ASSERT(index->IsNumber());
2241 2248
2242 uint32_t i = 0; 2249 uint32_t i = 0;
2243 if (index->IsSmi()) { 2250 if (index->IsSmi()) {
2244 int value = Smi::cast(index)->value(); 2251 int value = Smi::cast(index)->value();
2245 if (value < 0) return isolate->heap()->nan_value(); 2252 if (value < 0) return isolate->heap()->nan_value();
2246 i = value; 2253 i = value;
2247 } else { 2254 } else {
2248 ASSERT(index->IsHeapNumber()); 2255 ASSERT(index->IsHeapNumber());
(...skipping 956 matching lines...) Expand 10 before | Expand all | Expand 10 after
3205 MemoryChunk::IncrementLiveBytesFromMutator(answer->address(), -delta); 3212 MemoryChunk::IncrementLiveBytesFromMutator(answer->address(), -delta);
3206 } 3213 }
3207 3214
3208 return *answer; 3215 return *answer;
3209 } 3216 }
3210 3217
3211 3218
3212 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) { 3219 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringReplaceRegExpWithString) {
3213 ASSERT(args.length() == 4); 3220 ASSERT(args.length() == 4);
3214 3221
3215 CONVERT_CHECKED(String, subject, args[0]); 3222 CONVERT_CHECKED(String, subject, 0);
3216 if (!subject->IsFlat()) { 3223 if (!subject->IsFlat()) {
3217 Object* flat_subject; 3224 Object* flat_subject;
3218 { MaybeObject* maybe_flat_subject = subject->TryFlatten(); 3225 { MaybeObject* maybe_flat_subject = subject->TryFlatten();
3219 if (!maybe_flat_subject->ToObject(&flat_subject)) { 3226 if (!maybe_flat_subject->ToObject(&flat_subject)) {
3220 return maybe_flat_subject; 3227 return maybe_flat_subject;
3221 } 3228 }
3222 } 3229 }
3223 subject = String::cast(flat_subject); 3230 subject = String::cast(flat_subject);
3224 } 3231 }
3225 3232
3226 CONVERT_CHECKED(String, replacement, args[2]); 3233 CONVERT_CHECKED(String, replacement, 2);
3227 if (!replacement->IsFlat()) { 3234 if (!replacement->IsFlat()) {
3228 Object* flat_replacement; 3235 Object* flat_replacement;
3229 { MaybeObject* maybe_flat_replacement = replacement->TryFlatten(); 3236 { MaybeObject* maybe_flat_replacement = replacement->TryFlatten();
3230 if (!maybe_flat_replacement->ToObject(&flat_replacement)) { 3237 if (!maybe_flat_replacement->ToObject(&flat_replacement)) {
3231 return maybe_flat_replacement; 3238 return maybe_flat_replacement;
3232 } 3239 }
3233 } 3240 }
3234 replacement = String::cast(flat_replacement); 3241 replacement = String::cast(flat_replacement);
3235 } 3242 }
3236 3243
3237 CONVERT_CHECKED(JSRegExp, regexp, args[1]); 3244 CONVERT_CHECKED(JSRegExp, regexp, 1);
3238 CONVERT_CHECKED(JSArray, last_match_info, args[3]); 3245 CONVERT_CHECKED(JSArray, last_match_info, 3);
3239 3246
3240 ASSERT(last_match_info->HasFastElements()); 3247 ASSERT(last_match_info->HasFastElements());
3241 3248
3242 if (replacement->length() == 0) { 3249 if (replacement->length() == 0) {
3243 if (subject->HasOnlyAsciiChars()) { 3250 if (subject->HasOnlyAsciiChars()) {
3244 return StringReplaceRegExpWithEmptyString<SeqAsciiString>( 3251 return StringReplaceRegExpWithEmptyString<SeqAsciiString>(
3245 isolate, subject, regexp, last_match_info); 3252 isolate, subject, regexp, last_match_info);
3246 } else { 3253 } else {
3247 return StringReplaceRegExpWithEmptyString<SeqTwoByteString>( 3254 return StringReplaceRegExpWithEmptyString<SeqTwoByteString>(
3248 isolate, subject, regexp, last_match_info); 3255 isolate, subject, regexp, last_match_info);
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
3490 } 3497 }
3491 3498
3492 return Smi::FromInt(position); 3499 return Smi::FromInt(position);
3493 } 3500 }
3494 3501
3495 3502
3496 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLocaleCompare) { 3503 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringLocaleCompare) {
3497 NoHandleAllocation ha; 3504 NoHandleAllocation ha;
3498 ASSERT(args.length() == 2); 3505 ASSERT(args.length() == 2);
3499 3506
3500 CONVERT_CHECKED(String, str1, args[0]); 3507 CONVERT_CHECKED(String, str1, 0);
3501 CONVERT_CHECKED(String, str2, args[1]); 3508 CONVERT_CHECKED(String, str2, 1);
3502 3509
3503 if (str1 == str2) return Smi::FromInt(0); // Equal. 3510 if (str1 == str2) return Smi::FromInt(0); // Equal.
3504 int str1_length = str1->length(); 3511 int str1_length = str1->length();
3505 int str2_length = str2->length(); 3512 int str2_length = str2->length();
3506 3513
3507 // Decide trivial cases without flattening. 3514 // Decide trivial cases without flattening.
3508 if (str1_length == 0) { 3515 if (str1_length == 0) {
3509 if (str2_length == 0) return Smi::FromInt(0); // Equal. 3516 if (str2_length == 0) return Smi::FromInt(0); // Equal.
3510 return Smi::FromInt(-str2_length); 3517 return Smi::FromInt(-str2_length);
3511 } else { 3518 } else {
(...skipping 26 matching lines...) Expand all
3538 } 3545 }
3539 3546
3540 return Smi::FromInt(str1_length - str2_length); 3547 return Smi::FromInt(str1_length - str2_length);
3541 } 3548 }
3542 3549
3543 3550
3544 RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) { 3551 RUNTIME_FUNCTION(MaybeObject*, Runtime_SubString) {
3545 NoHandleAllocation ha; 3552 NoHandleAllocation ha;
3546 ASSERT(args.length() == 3); 3553 ASSERT(args.length() == 3);
3547 3554
3548 CONVERT_CHECKED(String, value, args[0]); 3555 CONVERT_CHECKED(String, value, 0);
3549 int start, end; 3556 int start, end;
3550 // We have a fast integer-only case here to avoid a conversion to double in 3557 // We have a fast integer-only case here to avoid a conversion to double in
3551 // the common case where from and to are Smis. 3558 // the common case where from and to are Smis.
3552 if (args[1]->IsSmi() && args[2]->IsSmi()) { 3559 if (args[1]->IsSmi() && args[2]->IsSmi()) {
3553 CONVERT_SMI_ARG_CHECKED(from_number, 1); 3560 CONVERT_SMI_ARG_CHECKED(from_number, 1);
3554 CONVERT_SMI_ARG_CHECKED(to_number, 2); 3561 CONVERT_SMI_ARG_CHECKED(to_number, 2);
3555 start = from_number; 3562 start = from_number;
3556 end = to_number; 3563 end = to_number;
3557 } else { 3564 } else {
3558 CONVERT_DOUBLE_ARG_CHECKED(from_number, 1); 3565 CONVERT_DOUBLE_ARG_CHECKED(from_number, 1);
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
4311 // Implements part of 8.12.9 DefineOwnProperty. 4318 // Implements part of 8.12.9 DefineOwnProperty.
4312 // There are 3 cases that lead here: 4319 // There are 3 cases that lead here:
4313 // Step 4b - define a new accessor property. 4320 // Step 4b - define a new accessor property.
4314 // Steps 9c & 12 - replace an existing data property with an accessor property. 4321 // Steps 9c & 12 - replace an existing data property with an accessor property.
4315 // Step 12 - update an existing accessor property with an accessor or generic 4322 // Step 12 - update an existing accessor property with an accessor or generic
4316 // descriptor. 4323 // descriptor.
4317 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineAccessorProperty) { 4324 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineAccessorProperty) {
4318 ASSERT(args.length() == 5); 4325 ASSERT(args.length() == 5);
4319 HandleScope scope(isolate); 4326 HandleScope scope(isolate);
4320 CONVERT_ARG_CHECKED(JSObject, obj, 0); 4327 CONVERT_ARG_CHECKED(JSObject, obj, 0);
4321 CONVERT_CHECKED(String, name, args[1]); 4328 CONVERT_CHECKED(String, name, 1);
4322 CONVERT_CHECKED(Smi, flag_setter, args[2]); 4329 CONVERT_SMI_ARG_CHECKED(flag_setter, 2);
4323 Object* fun = args[3]; 4330 Object* fun = args[3];
4324 CONVERT_CHECKED(Smi, flag_attr, args[4]); 4331 CONVERT_SMI_ARG_CHECKED(unchecked, 4);
4325 4332
4326 int unchecked = flag_attr->value();
4327 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 4333 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
4328 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); 4334 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked);
4329 4335
4330 RUNTIME_ASSERT(!obj->IsNull()); 4336 RUNTIME_ASSERT(!obj->IsNull());
4331 RUNTIME_ASSERT(fun->IsSpecFunction() || fun->IsUndefined()); 4337 RUNTIME_ASSERT(fun->IsSpecFunction() || fun->IsUndefined());
4332 return obj->DefineAccessor(name, flag_setter->value() == 0, fun, attr); 4338 return obj->DefineAccessor(name, flag_setter == 0, fun, attr);
4333 } 4339 }
4334 4340
4335 // Implements part of 8.12.9 DefineOwnProperty. 4341 // Implements part of 8.12.9 DefineOwnProperty.
4336 // There are 3 cases that lead here: 4342 // There are 3 cases that lead here:
4337 // Step 4a - define a new data property. 4343 // Step 4a - define a new data property.
4338 // Steps 9b & 12 - replace an existing accessor property with a data property. 4344 // Steps 9b & 12 - replace an existing accessor property with a data property.
4339 // Step 12 - update an existing data property with a data or generic 4345 // Step 12 - update an existing data property with a data or generic
4340 // descriptor. 4346 // descriptor.
4341 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) { 4347 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineOrRedefineDataProperty) {
4342 ASSERT(args.length() == 4); 4348 ASSERT(args.length() == 4);
4343 HandleScope scope(isolate); 4349 HandleScope scope(isolate);
4344 CONVERT_ARG_CHECKED(JSObject, js_object, 0); 4350 CONVERT_ARG_CHECKED(JSObject, js_object, 0);
4345 CONVERT_ARG_CHECKED(String, name, 1); 4351 CONVERT_ARG_CHECKED(String, name, 1);
4346 Handle<Object> obj_value = args.at<Object>(2); 4352 Handle<Object> obj_value = args.at<Object>(2);
4347 CONVERT_CHECKED(Smi, flag, args[3]); 4353 CONVERT_SMI_ARG_CHECKED(unchecked, 3);
4348 4354
4349 int unchecked = flag->value();
4350 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 4355 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
4351 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); 4356 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked);
4352 4357
4353 // Check if this is an element. 4358 // Check if this is an element.
4354 uint32_t index; 4359 uint32_t index;
4355 bool is_element = name->AsArrayIndex(&index); 4360 bool is_element = name->AsArrayIndex(&index);
4356 4361
4357 // Special case for elements if any of the flags might be involved. 4362 // Special case for elements if any of the flags might be involved.
4358 // If elements are in fast case we always implicitly assume that: 4363 // If elements are in fast case we always implicitly assume that:
4359 // DONT_DELETE: false, DONT_ENUM: false, READ_ONLY: false. 4364 // DONT_DELETE: false, DONT_ENUM: false, READ_ONLY: false.
(...skipping 391 matching lines...) Expand 10 before | Expand all | Expand 10 after
4751 } 4756 }
4752 return *object; 4757 return *object;
4753 } 4758 }
4754 4759
4755 4760
4756 // Set a local property, even if it is READ_ONLY. If the property does not 4761 // Set a local property, even if it is READ_ONLY. If the property does not
4757 // exist, it will be added with attributes NONE. 4762 // exist, it will be added with attributes NONE.
4758 RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) { 4763 RUNTIME_FUNCTION(MaybeObject*, Runtime_IgnoreAttributesAndSetProperty) {
4759 NoHandleAllocation ha; 4764 NoHandleAllocation ha;
4760 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4); 4765 RUNTIME_ASSERT(args.length() == 3 || args.length() == 4);
4761 CONVERT_CHECKED(JSObject, object, args[0]); 4766 CONVERT_CHECKED(JSObject, object, 0);
4762 CONVERT_CHECKED(String, name, args[1]); 4767 CONVERT_CHECKED(String, name, 1);
4763 // Compute attributes. 4768 // Compute attributes.
4764 PropertyAttributes attributes = NONE; 4769 PropertyAttributes attributes = NONE;
4765 if (args.length() == 4) { 4770 if (args.length() == 4) {
4766 CONVERT_CHECKED(Smi, value_obj, args[3]); 4771 CONVERT_SMI_ARG_CHECKED(unchecked_value, 3);
4767 int unchecked_value = value_obj->value();
4768 // Only attribute bits should be set. 4772 // Only attribute bits should be set.
4769 RUNTIME_ASSERT( 4773 RUNTIME_ASSERT(
4770 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 4774 (unchecked_value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
4771 attributes = static_cast<PropertyAttributes>(unchecked_value); 4775 attributes = static_cast<PropertyAttributes>(unchecked_value);
4772 } 4776 }
4773 4777
4774 return object-> 4778 return object->
4775 SetLocalPropertyIgnoreAttributes(name, args[2], attributes); 4779 SetLocalPropertyIgnoreAttributes(name, args[2], attributes);
4776 } 4780 }
4777 4781
4778 4782
4779 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) { 4783 RUNTIME_FUNCTION(MaybeObject*, Runtime_DeleteProperty) {
4780 NoHandleAllocation ha; 4784 NoHandleAllocation ha;
4781 ASSERT(args.length() == 3); 4785 ASSERT(args.length() == 3);
4782 4786
4783 CONVERT_CHECKED(JSReceiver, object, args[0]); 4787 CONVERT_CHECKED(JSReceiver, object, 0);
4784 CONVERT_CHECKED(String, key, args[1]); 4788 CONVERT_CHECKED(String, key, 1);
4785 CONVERT_STRICT_MODE_ARG(strict_mode, 2); 4789 CONVERT_STRICT_MODE_ARG(strict_mode, 2);
4786 return object->DeleteProperty(key, (strict_mode == kStrictMode) 4790 return object->DeleteProperty(key, (strict_mode == kStrictMode)
4787 ? JSReceiver::STRICT_DELETION 4791 ? JSReceiver::STRICT_DELETION
4788 : JSReceiver::NORMAL_DELETION); 4792 : JSReceiver::NORMAL_DELETION);
4789 } 4793 }
4790 4794
4791 4795
4792 static Object* HasLocalPropertyImplementation(Isolate* isolate, 4796 static Object* HasLocalPropertyImplementation(Isolate* isolate,
4793 Handle<JSObject> object, 4797 Handle<JSObject> object,
4794 Handle<String> key) { 4798 Handle<String> key) {
4795 if (object->HasLocalProperty(*key)) return isolate->heap()->true_value(); 4799 if (object->HasLocalProperty(*key)) return isolate->heap()->true_value();
4796 // Handle hidden prototypes. If there's a hidden prototype above this thing 4800 // Handle hidden prototypes. If there's a hidden prototype above this thing
4797 // then we have to check it for properties, because they are supposed to 4801 // then we have to check it for properties, because they are supposed to
4798 // look like they are on this object. 4802 // look like they are on this object.
4799 Handle<Object> proto(object->GetPrototype()); 4803 Handle<Object> proto(object->GetPrototype());
4800 if (proto->IsJSObject() && 4804 if (proto->IsJSObject() &&
4801 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) { 4805 Handle<JSObject>::cast(proto)->map()->is_hidden_prototype()) {
4802 return HasLocalPropertyImplementation(isolate, 4806 return HasLocalPropertyImplementation(isolate,
4803 Handle<JSObject>::cast(proto), 4807 Handle<JSObject>::cast(proto),
4804 key); 4808 key);
4805 } 4809 }
4806 return isolate->heap()->false_value(); 4810 return isolate->heap()->false_value();
4807 } 4811 }
4808 4812
4809 4813
4810 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) { 4814 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasLocalProperty) {
4811 NoHandleAllocation ha; 4815 NoHandleAllocation ha;
4812 ASSERT(args.length() == 2); 4816 ASSERT(args.length() == 2);
4813 CONVERT_CHECKED(String, key, args[1]); 4817 CONVERT_CHECKED(String, key, 1);
4814 4818
4815 uint32_t index; 4819 uint32_t index;
4816 const bool key_is_array_index = key->AsArrayIndex(&index); 4820 const bool key_is_array_index = key->AsArrayIndex(&index);
4817 4821
4818 Object* obj = args[0]; 4822 Object* obj = args[0];
4819 // Only JS objects can have properties. 4823 // Only JS objects can have properties.
4820 if (obj->IsJSObject()) { 4824 if (obj->IsJSObject()) {
4821 JSObject* object = JSObject::cast(obj); 4825 JSObject* object = JSObject::cast(obj);
4822 // Fast case: either the key is a real named property or it is not 4826 // Fast case: either the key is a real named property or it is not
4823 // an array index and there are no interceptors or hidden 4827 // an array index and there are no interceptors or hidden
(...skipping 17 matching lines...) Expand all
4841 return isolate->heap()->true_value(); 4845 return isolate->heap()->true_value();
4842 } 4846 }
4843 } 4847 }
4844 return isolate->heap()->false_value(); 4848 return isolate->heap()->false_value();
4845 } 4849 }
4846 4850
4847 4851
4848 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) { 4852 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasProperty) {
4849 NoHandleAllocation na; 4853 NoHandleAllocation na;
4850 ASSERT(args.length() == 2); 4854 ASSERT(args.length() == 2);
4851 CONVERT_CHECKED(JSReceiver, receiver, args[0]); 4855 CONVERT_CHECKED(JSReceiver, receiver, 0);
4852 CONVERT_CHECKED(String, key, args[1]); 4856 CONVERT_CHECKED(String, key, 1);
4853 4857
4854 bool result = receiver->HasProperty(key); 4858 bool result = receiver->HasProperty(key);
4855 if (isolate->has_pending_exception()) return Failure::Exception(); 4859 if (isolate->has_pending_exception()) return Failure::Exception();
4856 return isolate->heap()->ToBoolean(result); 4860 return isolate->heap()->ToBoolean(result);
4857 } 4861 }
4858 4862
4859 4863
4860 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) { 4864 RUNTIME_FUNCTION(MaybeObject*, Runtime_HasElement) {
4861 NoHandleAllocation na; 4865 NoHandleAllocation na;
4862 ASSERT(args.length() == 2); 4866 ASSERT(args.length() == 2);
4863 CONVERT_CHECKED(JSReceiver, receiver, args[0]); 4867 CONVERT_CHECKED(JSReceiver, receiver, 0);
4864 CONVERT_CHECKED(Smi, index, args[1]); 4868 CONVERT_SMI_ARG_CHECKED(index, 1);
4865 4869
4866 bool result = receiver->HasElement(index->value()); 4870 bool result = receiver->HasElement(index);
4867 if (isolate->has_pending_exception()) return Failure::Exception(); 4871 if (isolate->has_pending_exception()) return Failure::Exception();
4868 return isolate->heap()->ToBoolean(result); 4872 return isolate->heap()->ToBoolean(result);
4869 } 4873 }
4870 4874
4871 4875
4872 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) { 4876 RUNTIME_FUNCTION(MaybeObject*, Runtime_IsPropertyEnumerable) {
4873 NoHandleAllocation ha; 4877 NoHandleAllocation ha;
4874 ASSERT(args.length() == 2); 4878 ASSERT(args.length() == 2);
4875 4879
4876 CONVERT_CHECKED(JSObject, object, args[0]); 4880 CONVERT_CHECKED(JSObject, object, 0);
4877 CONVERT_CHECKED(String, key, args[1]); 4881 CONVERT_CHECKED(String, key, 1);
4878 4882
4879 uint32_t index; 4883 uint32_t index;
4880 if (key->AsArrayIndex(&index)) { 4884 if (key->AsArrayIndex(&index)) {
4881 JSObject::LocalElementType type = object->HasLocalElement(index); 4885 JSObject::LocalElementType type = object->HasLocalElement(index);
4882 switch (type) { 4886 switch (type) {
4883 case JSObject::UNDEFINED_ELEMENT: 4887 case JSObject::UNDEFINED_ELEMENT:
4884 case JSObject::STRING_CHARACTER_ELEMENT: 4888 case JSObject::STRING_CHARACTER_ELEMENT:
4885 return isolate->heap()->false_value(); 4889 return isolate->heap()->false_value();
4886 case JSObject::INTERCEPTED_ELEMENT: 4890 case JSObject::INTERCEPTED_ELEMENT:
4887 case JSObject::FAST_ELEMENT: 4891 case JSObject::FAST_ELEMENT:
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
4928 4932
4929 4933
4930 // Returns either a FixedArray as Runtime_GetPropertyNames, 4934 // Returns either a FixedArray as Runtime_GetPropertyNames,
4931 // or, if the given object has an enum cache that contains 4935 // or, if the given object has an enum cache that contains
4932 // all enumerable properties of the object and its prototypes 4936 // all enumerable properties of the object and its prototypes
4933 // have none, the map of the object. This is used to speed up 4937 // have none, the map of the object. This is used to speed up
4934 // the check for deletions during a for-in. 4938 // the check for deletions during a for-in.
4935 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) { 4939 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetPropertyNamesFast) {
4936 ASSERT(args.length() == 1); 4940 ASSERT(args.length() == 1);
4937 4941
4938 CONVERT_CHECKED(JSReceiver, raw_object, args[0]); 4942 CONVERT_CHECKED(JSReceiver, raw_object, 0);
4939 4943
4940 if (raw_object->IsSimpleEnum()) return raw_object->map(); 4944 if (raw_object->IsSimpleEnum()) return raw_object->map();
4941 4945
4942 HandleScope scope(isolate); 4946 HandleScope scope(isolate);
4943 Handle<JSReceiver> object(raw_object); 4947 Handle<JSReceiver> object(raw_object);
4944 bool threw = false; 4948 bool threw = false;
4945 Handle<FixedArray> content = 4949 Handle<FixedArray> content =
4946 GetKeysInFixedArrayFor(object, INCLUDE_PROTOS, &threw); 4950 GetKeysInFixedArrayFor(object, INCLUDE_PROTOS, &threw);
4947 if (threw) return Failure::Exception(); 4951 if (threw) return Failure::Exception();
4948 4952
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
5115 if (obj->HasIndexedInterceptor()) { 5119 if (obj->HasIndexedInterceptor()) {
5116 v8::Handle<v8::Array> result = GetKeysForIndexedInterceptor(obj, obj); 5120 v8::Handle<v8::Array> result = GetKeysForIndexedInterceptor(obj, obj);
5117 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result); 5121 if (!result.IsEmpty()) return *v8::Utils::OpenHandle(*result);
5118 } 5122 }
5119 return isolate->heap()->undefined_value(); 5123 return isolate->heap()->undefined_value();
5120 } 5124 }
5121 5125
5122 5126
5123 RUNTIME_FUNCTION(MaybeObject*, Runtime_LocalKeys) { 5127 RUNTIME_FUNCTION(MaybeObject*, Runtime_LocalKeys) {
5124 ASSERT_EQ(args.length(), 1); 5128 ASSERT_EQ(args.length(), 1);
5125 CONVERT_CHECKED(JSObject, raw_object, args[0]); 5129 CONVERT_CHECKED(JSObject, raw_object, 0);
5126 HandleScope scope(isolate); 5130 HandleScope scope(isolate);
5127 Handle<JSObject> object(raw_object); 5131 Handle<JSObject> object(raw_object);
5128 5132
5129 if (object->IsJSGlobalProxy()) { 5133 if (object->IsJSGlobalProxy()) {
5130 // Do access checks before going to the global object. 5134 // Do access checks before going to the global object.
5131 if (object->IsAccessCheckNeeded() && 5135 if (object->IsAccessCheckNeeded() &&
5132 !isolate->MayNamedAccess(*object, isolate->heap()->undefined_value(), 5136 !isolate->MayNamedAccess(*object, isolate->heap()->undefined_value(),
5133 v8::ACCESS_KEYS)) { 5137 v8::ACCESS_KEYS)) {
5134 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_KEYS); 5138 isolate->ReportFailedAccessCheck(*object, v8::ACCESS_KEYS);
5135 return *isolate->factory()->NewJSArray(0); 5139 return *isolate->factory()->NewJSArray(0);
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
5307 d = 10 * d + (s[i] - '0'); 5311 d = 10 * d + (s[i] - '0');
5308 } 5312 }
5309 5313
5310 return d; 5314 return d;
5311 } 5315 }
5312 5316
5313 5317
5314 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToNumber) { 5318 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringToNumber) {
5315 NoHandleAllocation ha; 5319 NoHandleAllocation ha;
5316 ASSERT(args.length() == 1); 5320 ASSERT(args.length() == 1);
5317 CONVERT_CHECKED(String, subject, args[0]); 5321 CONVERT_CHECKED(String, subject, 0);
5318 subject->TryFlatten(); 5322 subject->TryFlatten();
5319 5323
5320 // Fast case: short integer or some sorts of junk values. 5324 // Fast case: short integer or some sorts of junk values.
5321 int len = subject->length(); 5325 int len = subject->length();
5322 if (subject->IsSeqAsciiString()) { 5326 if (subject->IsSeqAsciiString()) {
5323 if (len == 0) return Smi::FromInt(0); 5327 if (len == 0) return Smi::FromInt(0);
5324 5328
5325 char const* data = SeqAsciiString::cast(subject)->GetChars(); 5329 char const* data = SeqAsciiString::cast(subject)->GetChars();
5326 bool minus = (data[0] == '-'); 5330 bool minus = (data[0] == '-');
5327 int start_pos = (minus ? 1 : 0); 5331 int start_pos = (minus ? 1 : 0);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
5363 // Slower case. 5367 // Slower case.
5364 return isolate->heap()->NumberFromDouble( 5368 return isolate->heap()->NumberFromDouble(
5365 StringToDouble(isolate->unicode_cache(), subject, ALLOW_HEX)); 5369 StringToDouble(isolate->unicode_cache(), subject, ALLOW_HEX));
5366 } 5370 }
5367 5371
5368 5372
5369 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringFromCharCodeArray) { 5373 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringFromCharCodeArray) {
5370 NoHandleAllocation ha; 5374 NoHandleAllocation ha;
5371 ASSERT(args.length() == 1); 5375 ASSERT(args.length() == 1);
5372 5376
5373 CONVERT_CHECKED(JSArray, codes, args[0]); 5377 CONVERT_CHECKED(JSArray, codes, 0);
5374 int length = Smi::cast(codes->length())->value(); 5378 int length = Smi::cast(codes->length())->value();
5375 5379
5376 // Check if the string can be ASCII. 5380 // Check if the string can be ASCII.
5377 int i; 5381 int i;
5378 for (i = 0; i < length; i++) { 5382 for (i = 0; i < length; i++) {
5379 Object* element; 5383 Object* element;
5380 { MaybeObject* maybe_element = codes->GetElement(i); 5384 { MaybeObject* maybe_element = codes->GetElement(i);
5381 // We probably can't get an exception here, but just in order to enforce 5385 // We probably can't get an exception here, but just in order to enforce
5382 // the checking of inputs in the runtime calls we check here. 5386 // the checking of inputs in the runtime calls we check here.
5383 if (!maybe_element->ToObject(&element)) return maybe_element; 5387 if (!maybe_element->ToObject(&element)) return maybe_element;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
5443 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5447 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5444 }; 5448 };
5445 return kNotEscaped[character] != 0; 5449 return kNotEscaped[character] != 0;
5446 } 5450 }
5447 5451
5448 5452
5449 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) { 5453 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIEscape) {
5450 const char hex_chars[] = "0123456789ABCDEF"; 5454 const char hex_chars[] = "0123456789ABCDEF";
5451 NoHandleAllocation ha; 5455 NoHandleAllocation ha;
5452 ASSERT(args.length() == 1); 5456 ASSERT(args.length() == 1);
5453 CONVERT_CHECKED(String, source, args[0]); 5457 CONVERT_CHECKED(String, source, 0);
5454 5458
5455 source->TryFlatten(); 5459 source->TryFlatten();
5456 5460
5457 int escaped_length = 0; 5461 int escaped_length = 0;
5458 int length = source->length(); 5462 int length = source->length();
5459 { 5463 {
5460 Access<StringInputBuffer> buffer( 5464 Access<StringInputBuffer> buffer(
5461 isolate->runtime_state()->string_input_buffer()); 5465 isolate->runtime_state()->string_input_buffer());
5462 buffer->Reset(source); 5466 buffer->Reset(source);
5463 while (buffer->has_more()) { 5467 while (buffer->has_more()) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
5561 } else { 5565 } else {
5562 *step = 1; 5566 *step = 1;
5563 return character; 5567 return character;
5564 } 5568 }
5565 } 5569 }
5566 5570
5567 5571
5568 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIUnescape) { 5572 RUNTIME_FUNCTION(MaybeObject*, Runtime_URIUnescape) {
5569 NoHandleAllocation ha; 5573 NoHandleAllocation ha;
5570 ASSERT(args.length() == 1); 5574 ASSERT(args.length() == 1);
5571 CONVERT_CHECKED(String, source, args[0]); 5575 CONVERT_CHECKED(String, source, 0);
5572 5576
5573 source->TryFlatten(); 5577 source->TryFlatten();
5574 5578
5575 bool ascii = true; 5579 bool ascii = true;
5576 int length = source->length(); 5580 int length = source->length();
5577 5581
5578 int unescaped_length = 0; 5582 int unescaped_length = 0;
5579 for (int i = 0; i < length; unescaped_length++) { 5583 for (int i = 0; i < length; unescaped_length++) {
5580 int step; 5584 int step;
5581 if (Unescape(source, i, length, &step) > String::kMaxAsciiCharCode) { 5585 if (Unescape(source, i, length, &step) > String::kMaxAsciiCharCode) {
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after
5818 new_string->address() + SeqString::kHeaderSize)); 5822 new_string->address() + SeqString::kHeaderSize));
5819 isolate->heap()->new_space()-> 5823 isolate->heap()->new_space()->
5820 template ShrinkStringAtAllocationBoundary<StringType>( 5824 template ShrinkStringAtAllocationBoundary<StringType>(
5821 new_string, final_length); 5825 new_string, final_length);
5822 return new_string; 5826 return new_string;
5823 } 5827 }
5824 5828
5825 5829
5826 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONString) { 5830 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONString) {
5827 NoHandleAllocation ha; 5831 NoHandleAllocation ha;
5828 CONVERT_CHECKED(String, str, args[0]); 5832 CONVERT_CHECKED(String, str, 0);
5829 if (!str->IsFlat()) { 5833 if (!str->IsFlat()) {
5830 MaybeObject* try_flatten = str->TryFlatten(); 5834 MaybeObject* try_flatten = str->TryFlatten();
5831 Object* flat; 5835 Object* flat;
5832 if (!try_flatten->ToObject(&flat)) { 5836 if (!try_flatten->ToObject(&flat)) {
5833 return try_flatten; 5837 return try_flatten;
5834 } 5838 }
5835 str = String::cast(flat); 5839 str = String::cast(flat);
5836 ASSERT(str->IsFlat()); 5840 ASSERT(str->IsFlat());
5837 } 5841 }
5838 String::FlatContent flat = str->GetFlatContent(); 5842 String::FlatContent flat = str->GetFlatContent();
5839 ASSERT(flat.IsFlat()); 5843 ASSERT(flat.IsFlat());
5840 if (flat.IsTwoByte()) { 5844 if (flat.IsTwoByte()) {
5841 return QuoteJsonString<uc16, SeqTwoByteString, false>(isolate, 5845 return QuoteJsonString<uc16, SeqTwoByteString, false>(isolate,
5842 flat.ToUC16Vector()); 5846 flat.ToUC16Vector());
5843 } else { 5847 } else {
5844 return QuoteJsonString<char, SeqAsciiString, false>(isolate, 5848 return QuoteJsonString<char, SeqAsciiString, false>(isolate,
5845 flat.ToAsciiVector()); 5849 flat.ToAsciiVector());
5846 } 5850 }
5847 } 5851 }
5848 5852
5849 5853
5850 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringComma) { 5854 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringComma) {
5851 NoHandleAllocation ha; 5855 NoHandleAllocation ha;
5852 CONVERT_CHECKED(String, str, args[0]); 5856 CONVERT_CHECKED(String, str, 0);
5853 if (!str->IsFlat()) { 5857 if (!str->IsFlat()) {
5854 MaybeObject* try_flatten = str->TryFlatten(); 5858 MaybeObject* try_flatten = str->TryFlatten();
5855 Object* flat; 5859 Object* flat;
5856 if (!try_flatten->ToObject(&flat)) { 5860 if (!try_flatten->ToObject(&flat)) {
5857 return try_flatten; 5861 return try_flatten;
5858 } 5862 }
5859 str = String::cast(flat); 5863 str = String::cast(flat);
5860 ASSERT(str->IsFlat()); 5864 ASSERT(str->IsFlat());
5861 } 5865 }
5862 String::FlatContent flat = str->GetFlatContent(); 5866 String::FlatContent flat = str->GetFlatContent();
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
5919 isolate->heap()->new_space()-> 5923 isolate->heap()->new_space()->
5920 template ShrinkStringAtAllocationBoundary<StringType>( 5924 template ShrinkStringAtAllocationBoundary<StringType>(
5921 new_string, final_length); 5925 new_string, final_length);
5922 return new_string; 5926 return new_string;
5923 } 5927 }
5924 5928
5925 5929
5926 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringArray) { 5930 RUNTIME_FUNCTION(MaybeObject*, Runtime_QuoteJSONStringArray) {
5927 NoHandleAllocation ha; 5931 NoHandleAllocation ha;
5928 ASSERT(args.length() == 1); 5932 ASSERT(args.length() == 1);
5929 CONVERT_CHECKED(JSArray, array, args[0]); 5933 CONVERT_CHECKED(JSArray, array, 0);
5930 5934
5931 if (!array->HasFastElements()) return isolate->heap()->undefined_value(); 5935 if (!array->HasFastElements()) return isolate->heap()->undefined_value();
5932 FixedArray* elements = FixedArray::cast(array->elements()); 5936 FixedArray* elements = FixedArray::cast(array->elements());
5933 int n = elements->length(); 5937 int n = elements->length();
5934 bool ascii = true; 5938 bool ascii = true;
5935 int total_length = 0; 5939 int total_length = 0;
5936 5940
5937 for (int i = 0; i < n; i++) { 5941 for (int i = 0; i < n; i++) {
5938 Object* elt = elements->get(i); 5942 Object* elt = elements->get(i);
5939 if (!elt->IsString()) return isolate->heap()->undefined_value(); 5943 if (!elt->IsString()) return isolate->heap()->undefined_value();
(...skipping 21 matching lines...) Expand all
5961 return QuoteJsonStringArray<uc16, SeqTwoByteString>(isolate, 5965 return QuoteJsonStringArray<uc16, SeqTwoByteString>(isolate,
5962 elements, 5966 elements,
5963 worst_case_length); 5967 worst_case_length);
5964 } 5968 }
5965 } 5969 }
5966 5970
5967 5971
5968 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseInt) { 5972 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseInt) {
5969 NoHandleAllocation ha; 5973 NoHandleAllocation ha;
5970 5974
5971 CONVERT_CHECKED(String, s, args[0]); 5975 CONVERT_CHECKED(String, s, 0);
5972 CONVERT_SMI_ARG_CHECKED(radix, 1); 5976 CONVERT_SMI_ARG_CHECKED(radix, 1);
5973 5977
5974 s->TryFlatten(); 5978 s->TryFlatten();
5975 5979
5976 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36)); 5980 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36));
5977 double value = StringToInt(isolate->unicode_cache(), s, radix); 5981 double value = StringToInt(isolate->unicode_cache(), s, radix);
5978 return isolate->heap()->NumberFromDouble(value); 5982 return isolate->heap()->NumberFromDouble(value);
5979 } 5983 }
5980 5984
5981 5985
5982 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseFloat) { 5986 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringParseFloat) {
5983 NoHandleAllocation ha; 5987 NoHandleAllocation ha;
5984 CONVERT_CHECKED(String, str, args[0]); 5988 CONVERT_CHECKED(String, str, 0);
5985 5989
5986 // ECMA-262 section 15.1.2.3, empty string is NaN 5990 // ECMA-262 section 15.1.2.3, empty string is NaN
5987 double value = StringToDouble(isolate->unicode_cache(), 5991 double value = StringToDouble(isolate->unicode_cache(),
5988 str, ALLOW_TRAILING_JUNK, OS::nan_value()); 5992 str, ALLOW_TRAILING_JUNK, OS::nan_value());
5989 5993
5990 // Create a number object from the value. 5994 // Create a number object from the value.
5991 return isolate->heap()->NumberFromDouble(value); 5995 return isolate->heap()->NumberFromDouble(value);
5992 } 5996 }
5993 5997
5994 5998
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
6223 6227
6224 } // namespace 6228 } // namespace
6225 6229
6226 6230
6227 template <typename ConvertTraits> 6231 template <typename ConvertTraits>
6228 MUST_USE_RESULT static MaybeObject* ConvertCase( 6232 MUST_USE_RESULT static MaybeObject* ConvertCase(
6229 Arguments args, 6233 Arguments args,
6230 Isolate* isolate, 6234 Isolate* isolate,
6231 unibrow::Mapping<typename ConvertTraits::UnibrowConverter, 128>* mapping) { 6235 unibrow::Mapping<typename ConvertTraits::UnibrowConverter, 128>* mapping) {
6232 NoHandleAllocation ha; 6236 NoHandleAllocation ha;
6233 CONVERT_CHECKED(String, s, args[0]); 6237 CONVERT_CHECKED(String, s, 0);
6234 s = s->TryFlattenGetString(); 6238 s = s->TryFlattenGetString();
6235 6239
6236 const int length = s->length(); 6240 const int length = s->length();
6237 // Assume that the string is not empty; we need this assumption later 6241 // Assume that the string is not empty; we need this assumption later
6238 if (length == 0) return s; 6242 if (length == 0) return s;
6239 6243
6240 // Simpler handling of ASCII strings. 6244 // Simpler handling of ASCII strings.
6241 // 6245 //
6242 // NOTE: This assumes that the upper/lower case of an ASCII 6246 // NOTE: This assumes that the upper/lower case of an ASCII
6243 // character is also ASCII. This is currently the case, but it 6247 // character is also ASCII. This is currently the case, but it
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
6285 6289
6286 static inline bool IsTrimWhiteSpace(unibrow::uchar c) { 6290 static inline bool IsTrimWhiteSpace(unibrow::uchar c) {
6287 return unibrow::WhiteSpace::Is(c) || c == 0x200b || c == 0xfeff; 6291 return unibrow::WhiteSpace::Is(c) || c == 0x200b || c == 0xfeff;
6288 } 6292 }
6289 6293
6290 6294
6291 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringTrim) { 6295 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringTrim) {
6292 NoHandleAllocation ha; 6296 NoHandleAllocation ha;
6293 ASSERT(args.length() == 3); 6297 ASSERT(args.length() == 3);
6294 6298
6295 CONVERT_CHECKED(String, s, args[0]); 6299 CONVERT_CHECKED(String, s, 0);
6296 CONVERT_BOOLEAN_CHECKED(trimLeft, args[1]); 6300 CONVERT_BOOLEAN_CHECKED(trimLeft, 1);
6297 CONVERT_BOOLEAN_CHECKED(trimRight, args[2]); 6301 CONVERT_BOOLEAN_CHECKED(trimRight, 2);
6298 6302
6299 s->TryFlatten(); 6303 s->TryFlatten();
6300 int length = s->length(); 6304 int length = s->length();
6301 6305
6302 int left = 0; 6306 int left = 0;
6303 if (trimLeft) { 6307 if (trimLeft) {
6304 while (left < length && IsTrimWhiteSpace(s->Get(left))) { 6308 while (left < length && IsTrimWhiteSpace(s->Get(left))) {
6305 left++; 6309 left++;
6306 } 6310 }
6307 } 6311 }
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
6485 } 6489 }
6486 #endif 6490 #endif
6487 6491
6488 return *isolate->factory()->NewJSArrayWithElements(elements); 6492 return *isolate->factory()->NewJSArrayWithElements(elements);
6489 } 6493 }
6490 6494
6491 6495
6492 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStringWrapper) { 6496 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewStringWrapper) {
6493 NoHandleAllocation ha; 6497 NoHandleAllocation ha;
6494 ASSERT(args.length() == 1); 6498 ASSERT(args.length() == 1);
6495 CONVERT_CHECKED(String, value, args[0]); 6499 CONVERT_CHECKED(String, value, 0);
6496 return value->ToObject(); 6500 return value->ToObject();
6497 } 6501 }
6498 6502
6499 6503
6500 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { 6504 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) {
6501 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; 6505 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth];
6502 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); 6506 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars);
6503 return char_length == 0; 6507 return char_length == 0;
6504 } 6508 }
6505 6509
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
6676 6680
6677 x = modulo(x, y); 6681 x = modulo(x, y);
6678 // NumberFromDouble may return a Smi instead of a Number object 6682 // NumberFromDouble may return a Smi instead of a Number object
6679 return isolate->heap()->NumberFromDouble(x); 6683 return isolate->heap()->NumberFromDouble(x);
6680 } 6684 }
6681 6685
6682 6686
6683 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringAdd) { 6687 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringAdd) {
6684 NoHandleAllocation ha; 6688 NoHandleAllocation ha;
6685 ASSERT(args.length() == 2); 6689 ASSERT(args.length() == 2);
6686 CONVERT_CHECKED(String, str1, args[0]); 6690 CONVERT_CHECKED(String, str1, 0);
6687 CONVERT_CHECKED(String, str2, args[1]); 6691 CONVERT_CHECKED(String, str2, 1);
6688 isolate->counters()->string_add_runtime()->Increment(); 6692 isolate->counters()->string_add_runtime()->Increment();
6689 return isolate->heap()->AllocateConsString(str1, str2); 6693 return isolate->heap()->AllocateConsString(str1, str2);
6690 } 6694 }
6691 6695
6692 6696
6693 template <typename sinkchar> 6697 template <typename sinkchar>
6694 static inline void StringBuilderConcatHelper(String* special, 6698 static inline void StringBuilderConcatHelper(String* special,
6695 sinkchar* sink, 6699 sinkchar* sink,
6696 FixedArray* fixed_array, 6700 FixedArray* fixed_array,
6697 int array_length) { 6701 int array_length) {
(...skipping 27 matching lines...) Expand all
6725 String::WriteToFlat(string, sink + position, 0, element_length); 6729 String::WriteToFlat(string, sink + position, 0, element_length);
6726 position += element_length; 6730 position += element_length;
6727 } 6731 }
6728 } 6732 }
6729 } 6733 }
6730 6734
6731 6735
6732 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) { 6736 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderConcat) {
6733 NoHandleAllocation ha; 6737 NoHandleAllocation ha;
6734 ASSERT(args.length() == 3); 6738 ASSERT(args.length() == 3);
6735 CONVERT_CHECKED(JSArray, array, args[0]); 6739 CONVERT_CHECKED(JSArray, array, 0);
6736 if (!args[1]->IsSmi()) { 6740 if (!args[1]->IsSmi()) {
6737 isolate->context()->mark_out_of_memory(); 6741 isolate->context()->mark_out_of_memory();
6738 return Failure::OutOfMemoryException(); 6742 return Failure::OutOfMemoryException();
6739 } 6743 }
6740 int array_length = args.smi_at(1); 6744 int array_length = args.smi_at(1);
6741 CONVERT_CHECKED(String, special, args[2]); 6745 CONVERT_CHECKED(String, special, 2);
6742 6746
6743 // This assumption is used by the slice encoding in one or two smis. 6747 // This assumption is used by the slice encoding in one or two smis.
6744 ASSERT(Smi::kMaxValue >= String::kMaxLength); 6748 ASSERT(Smi::kMaxValue >= String::kMaxLength);
6745 6749
6746 MaybeObject* maybe_result = array->EnsureCanContainHeapObjectElements(); 6750 MaybeObject* maybe_result = array->EnsureCanContainHeapObjectElements();
6747 if (maybe_result->IsFailure()) return maybe_result; 6751 if (maybe_result->IsFailure()) return maybe_result;
6748 6752
6749 int special_length = special->length(); 6753 int special_length = special->length();
6750 if (!array->HasFastElements()) { 6754 if (!array->HasFastElements()) {
6751 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); 6755 return isolate->Throw(isolate->heap()->illegal_argument_symbol());
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
6841 fixed_array, 6845 fixed_array,
6842 array_length); 6846 array_length);
6843 return answer; 6847 return answer;
6844 } 6848 }
6845 } 6849 }
6846 6850
6847 6851
6848 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) { 6852 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringBuilderJoin) {
6849 NoHandleAllocation ha; 6853 NoHandleAllocation ha;
6850 ASSERT(args.length() == 3); 6854 ASSERT(args.length() == 3);
6851 CONVERT_CHECKED(JSArray, array, args[0]); 6855 CONVERT_CHECKED(JSArray, array, 0);
6852 if (!args[1]->IsSmi()) { 6856 if (!args[1]->IsSmi()) {
6853 isolate->context()->mark_out_of_memory(); 6857 isolate->context()->mark_out_of_memory();
6854 return Failure::OutOfMemoryException(); 6858 return Failure::OutOfMemoryException();
6855 } 6859 }
6856 int array_length = args.smi_at(1); 6860 int array_length = args.smi_at(1);
6857 CONVERT_CHECKED(String, separator, args[2]); 6861 CONVERT_CHECKED(String, separator, 2);
6858 6862
6859 if (!array->HasFastElements()) { 6863 if (!array->HasFastElements()) {
6860 return isolate->Throw(isolate->heap()->illegal_argument_symbol()); 6864 return isolate->Throw(isolate->heap()->illegal_argument_symbol());
6861 } 6865 }
6862 FixedArray* fixed_array = FixedArray::cast(array->elements()); 6866 FixedArray* fixed_array = FixedArray::cast(array->elements());
6863 if (fixed_array->length() < array_length) { 6867 if (fixed_array->length() < array_length) {
6864 array_length = fixed_array->length(); 6868 array_length = fixed_array->length();
6865 } 6869 }
6866 6870
6867 if (array_length == 0) { 6871 if (array_length == 0) {
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
6965 previous_separator_position++; 6969 previous_separator_position++;
6966 } 6970 }
6967 } 6971 }
6968 ASSERT(cursor <= buffer.length()); 6972 ASSERT(cursor <= buffer.length());
6969 } 6973 }
6970 6974
6971 6975
6972 RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) { 6976 RUNTIME_FUNCTION(MaybeObject*, Runtime_SparseJoinWithSeparator) {
6973 NoHandleAllocation ha; 6977 NoHandleAllocation ha;
6974 ASSERT(args.length() == 3); 6978 ASSERT(args.length() == 3);
6975 CONVERT_CHECKED(JSArray, elements_array, args[0]); 6979 CONVERT_CHECKED(JSArray, elements_array, 0);
6976 RUNTIME_ASSERT(elements_array->HasFastElements() || 6980 RUNTIME_ASSERT(elements_array->HasFastElements() ||
6977 elements_array->HasFastSmiOnlyElements()); 6981 elements_array->HasFastSmiOnlyElements());
6978 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]); 6982 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]);
6979 CONVERT_CHECKED(String, separator, args[2]); 6983 CONVERT_CHECKED(String, separator, 2);
6980 // elements_array is fast-mode JSarray of alternating positions 6984 // elements_array is fast-mode JSarray of alternating positions
6981 // (increasing order) and strings. 6985 // (increasing order) and strings.
6982 // array_length is length of original array (used to add separators); 6986 // array_length is length of original array (used to add separators);
6983 // separator is string to put between elements. Assumed to be non-empty. 6987 // separator is string to put between elements. Assumed to be non-empty.
6984 6988
6985 // Find total length of join result. 6989 // Find total length of join result.
6986 int string_length = 0; 6990 int string_length = 0;
6987 bool is_ascii = separator->IsAsciiRepresentation(); 6991 bool is_ascii = separator->IsAsciiRepresentation();
6988 int max_string_length; 6992 int max_string_length;
6989 if (is_ascii) { 6993 if (is_ascii) {
6990 max_string_length = SeqAsciiString::kMaxLength; 6994 max_string_length = SeqAsciiString::kMaxLength;
6991 } else { 6995 } else {
6992 max_string_length = SeqTwoByteString::kMaxLength; 6996 max_string_length = SeqTwoByteString::kMaxLength;
6993 } 6997 }
6994 bool overflow = false; 6998 bool overflow = false;
6995 CONVERT_NUMBER_CHECKED(int, elements_length, 6999 CONVERT_NUMBER_CHECKED(int, elements_length,
6996 Int32, elements_array->length()); 7000 Int32, elements_array->length());
6997 RUNTIME_ASSERT((elements_length & 1) == 0); // Even length. 7001 RUNTIME_ASSERT((elements_length & 1) == 0); // Even length.
6998 FixedArray* elements = FixedArray::cast(elements_array->elements()); 7002 FixedArray* elements = FixedArray::cast(elements_array->elements());
6999 for (int i = 0; i < elements_length; i += 2) { 7003 for (int i = 0; i < elements_length; i += 2) {
7000 RUNTIME_ASSERT(elements->get(i)->IsNumber()); 7004 RUNTIME_ASSERT(elements->get(i)->IsNumber());
7001 CONVERT_CHECKED(String, string, elements->get(i + 1)); 7005 RUNTIME_ASSERT(elements->get(i + 1)->IsString());
7006 String* string = String::cast(elements->get(i + 1));
7002 int length = string->length(); 7007 int length = string->length();
7003 if (is_ascii && !string->IsAsciiRepresentation()) { 7008 if (is_ascii && !string->IsAsciiRepresentation()) {
7004 is_ascii = false; 7009 is_ascii = false;
7005 max_string_length = SeqTwoByteString::kMaxLength; 7010 max_string_length = SeqTwoByteString::kMaxLength;
7006 } 7011 }
7007 if (length > max_string_length || 7012 if (length > max_string_length ||
7008 max_string_length - length < string_length) { 7013 max_string_length - length < string_length) {
7009 overflow = true; 7014 overflow = true;
7010 break; 7015 break;
7011 } 7016 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
7149 result = Smi::FromInt(NOT_EQUAL); 7154 result = Smi::FromInt(NOT_EQUAL);
7150 } 7155 }
7151 return result; 7156 return result;
7152 } 7157 }
7153 7158
7154 7159
7155 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringEquals) { 7160 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringEquals) {
7156 NoHandleAllocation ha; 7161 NoHandleAllocation ha;
7157 ASSERT(args.length() == 2); 7162 ASSERT(args.length() == 2);
7158 7163
7159 CONVERT_CHECKED(String, x, args[0]); 7164 CONVERT_CHECKED(String, x, 0);
7160 CONVERT_CHECKED(String, y, args[1]); 7165 CONVERT_CHECKED(String, y, 1);
7161 7166
7162 bool not_equal = !x->Equals(y); 7167 bool not_equal = !x->Equals(y);
7163 // This is slightly convoluted because the value that signifies 7168 // This is slightly convoluted because the value that signifies
7164 // equality is 0 and inequality is 1 so we have to negate the result 7169 // equality is 0 and inequality is 1 so we have to negate the result
7165 // from String::Equals. 7170 // from String::Equals.
7166 ASSERT(not_equal == 0 || not_equal == 1); 7171 ASSERT(not_equal == 0 || not_equal == 1);
7167 STATIC_CHECK(EQUAL == 0); 7172 STATIC_CHECK(EQUAL == 0);
7168 STATIC_CHECK(NOT_EQUAL == 1); 7173 STATIC_CHECK(NOT_EQUAL == 1);
7169 return Smi::FromInt(not_equal); 7174 return Smi::FromInt(not_equal);
7170 } 7175 }
(...skipping 10 matching lines...) Expand all
7181 if (isless(x, y)) return Smi::FromInt(LESS); 7186 if (isless(x, y)) return Smi::FromInt(LESS);
7182 return Smi::FromInt(GREATER); 7187 return Smi::FromInt(GREATER);
7183 } 7188 }
7184 7189
7185 7190
7186 // Compare two Smis as if they were converted to strings and then 7191 // Compare two Smis as if they were converted to strings and then
7187 // compared lexicographically. 7192 // compared lexicographically.
7188 RUNTIME_FUNCTION(MaybeObject*, Runtime_SmiLexicographicCompare) { 7193 RUNTIME_FUNCTION(MaybeObject*, Runtime_SmiLexicographicCompare) {
7189 NoHandleAllocation ha; 7194 NoHandleAllocation ha;
7190 ASSERT(args.length() == 2); 7195 ASSERT(args.length() == 2);
7191 7196 CONVERT_SMI_ARG_CHECKED(x_value, 0);
7192 // Extract the integer values from the Smis. 7197 CONVERT_SMI_ARG_CHECKED(y_value, 1);
7193 CONVERT_CHECKED(Smi, x, args[0]);
7194 CONVERT_CHECKED(Smi, y, args[1]);
7195 int x_value = x->value();
7196 int y_value = y->value();
7197 7198
7198 // If the integers are equal so are the string representations. 7199 // If the integers are equal so are the string representations.
7199 if (x_value == y_value) return Smi::FromInt(EQUAL); 7200 if (x_value == y_value) return Smi::FromInt(EQUAL);
7200 7201
7201 // If one of the integers is zero the normal integer order is the 7202 // If one of the integers is zero the normal integer order is the
7202 // same as the lexicographic order of the string representations. 7203 // same as the lexicographic order of the string representations.
7203 if (x_value == 0 || y_value == 0) 7204 if (x_value == 0 || y_value == 0)
7204 return Smi::FromInt(x_value < y_value ? LESS : GREATER); 7205 return Smi::FromInt(x_value < y_value ? LESS : GREATER);
7205 7206
7206 // If only one of the integers is negative the negative number is 7207 // If only one of the integers is negative the negative number is
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
7326 ASSERT(result == 7327 ASSERT(result ==
7327 StringInputBufferCompare(Isolate::Current()->runtime_state(), x, y)); 7328 StringInputBufferCompare(Isolate::Current()->runtime_state(), x, y));
7328 return result; 7329 return result;
7329 } 7330 }
7330 7331
7331 7332
7332 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) { 7333 RUNTIME_FUNCTION(MaybeObject*, Runtime_StringCompare) {
7333 NoHandleAllocation ha; 7334 NoHandleAllocation ha;
7334 ASSERT(args.length() == 2); 7335 ASSERT(args.length() == 2);
7335 7336
7336 CONVERT_CHECKED(String, x, args[0]); 7337 CONVERT_CHECKED(String, x, 0);
7337 CONVERT_CHECKED(String, y, args[1]); 7338 CONVERT_CHECKED(String, y, 1);
7338 7339
7339 isolate->counters()->string_compare_runtime()->Increment(); 7340 isolate->counters()->string_compare_runtime()->Increment();
7340 7341
7341 // A few fast case tests before we flatten. 7342 // A few fast case tests before we flatten.
7342 if (x == y) return Smi::FromInt(EQUAL); 7343 if (x == y) return Smi::FromInt(EQUAL);
7343 if (y->length() == 0) { 7344 if (y->length() == 0) {
7344 if (x->length() == 0) return Smi::FromInt(EQUAL); 7345 if (x->length() == 0) return Smi::FromInt(EQUAL);
7345 return Smi::FromInt(GREATER); 7346 return Smi::FromInt(GREATER);
7346 } else if (x->length() == 0) { 7347 } else if (x->length() == 0) {
7347 return Smi::FromInt(LESS); 7348 return Smi::FromInt(LESS);
(...skipping 586 matching lines...) Expand 10 before | Expand all | Expand 10 after
7934 DateYMDFromTimeSlow(date, year, month, day); 7935 DateYMDFromTimeSlow(date, year, month, day);
7935 } 7936 }
7936 } 7937 }
7937 7938
7938 7939
7939 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateYMDFromTime) { 7940 RUNTIME_FUNCTION(MaybeObject*, Runtime_DateYMDFromTime) {
7940 NoHandleAllocation ha; 7941 NoHandleAllocation ha;
7941 ASSERT(args.length() == 2); 7942 ASSERT(args.length() == 2);
7942 7943
7943 CONVERT_DOUBLE_ARG_CHECKED(t, 0); 7944 CONVERT_DOUBLE_ARG_CHECKED(t, 0);
7944 CONVERT_CHECKED(JSArray, res_array, args[1]); 7945 CONVERT_CHECKED(JSArray, res_array, 1);
7945 7946
7946 int year, month, day; 7947 int year, month, day;
7947 DateYMDFromTime(static_cast<int>(floor(t / 86400000)), year, month, day); 7948 DateYMDFromTime(static_cast<int>(floor(t / 86400000)), year, month, day);
7948 7949
7949 FixedArrayBase* elms_base = FixedArrayBase::cast(res_array->elements()); 7950 FixedArrayBase* elms_base = FixedArrayBase::cast(res_array->elements());
7950 RUNTIME_ASSERT(elms_base->length() == 3); 7951 RUNTIME_ASSERT(elms_base->length() == 3);
7951 RUNTIME_ASSERT(res_array->HasFastTypeElements()); 7952 RUNTIME_ASSERT(res_array->HasFastTypeElements());
7952 7953
7953 MaybeObject* maybe = res_array->EnsureWritableFastElements(); 7954 MaybeObject* maybe = res_array->EnsureWritableFastElements();
7954 if (maybe->IsFailure()) return maybe; 7955 if (maybe->IsFailure()) return maybe;
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
8091 } 8092 }
8092 return result; 8093 return result;
8093 } 8094 }
8094 8095
8095 8096
8096 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewClosure) { 8097 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewClosure) {
8097 HandleScope scope(isolate); 8098 HandleScope scope(isolate);
8098 ASSERT(args.length() == 3); 8099 ASSERT(args.length() == 3);
8099 CONVERT_ARG_CHECKED(Context, context, 0); 8100 CONVERT_ARG_CHECKED(Context, context, 0);
8100 CONVERT_ARG_CHECKED(SharedFunctionInfo, shared, 1); 8101 CONVERT_ARG_CHECKED(SharedFunctionInfo, shared, 1);
8101 CONVERT_BOOLEAN_CHECKED(pretenure, args[2]); 8102 CONVERT_BOOLEAN_CHECKED(pretenure, 2);
8102 8103
8103 // The caller ensures that we pretenure closures that are assigned 8104 // The caller ensures that we pretenure closures that are assigned
8104 // directly to properties. 8105 // directly to properties.
8105 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED; 8106 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED;
8106 Handle<JSFunction> result = 8107 Handle<JSFunction> result =
8107 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, 8108 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared,
8108 context, 8109 context,
8109 pretenure_flag); 8110 pretenure_flag);
8110 return *result; 8111 return *result;
8111 } 8112 }
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after
8747 8748
8748 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckIsBootstrapping) { 8749 RUNTIME_FUNCTION(MaybeObject*, Runtime_CheckIsBootstrapping) {
8749 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive()); 8750 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive());
8750 return isolate->heap()->undefined_value(); 8751 return isolate->heap()->undefined_value();
8751 } 8752 }
8752 8753
8753 8754
8754 RUNTIME_FUNCTION(MaybeObject*, Runtime_Call) { 8755 RUNTIME_FUNCTION(MaybeObject*, Runtime_Call) {
8755 HandleScope scope(isolate); 8756 HandleScope scope(isolate);
8756 ASSERT(args.length() >= 2); 8757 ASSERT(args.length() >= 2);
8757 CONVERT_CHECKED(JSReceiver, fun, args[args.length() - 1]); 8758 int argc = args.length() - 2;
8759 CONVERT_CHECKED(JSReceiver, fun, argc + 1);
8758 Object* receiver = args[0]; 8760 Object* receiver = args[0];
8759 int argc = args.length() - 2;
8760 8761
8761 // If there are too many arguments, allocate argv via malloc. 8762 // If there are too many arguments, allocate argv via malloc.
8762 const int argv_small_size = 10; 8763 const int argv_small_size = 10;
8763 Handle<Object> argv_small_buffer[argv_small_size]; 8764 Handle<Object> argv_small_buffer[argv_small_size];
8764 SmartArrayPointer<Handle<Object> > argv_large_buffer; 8765 SmartArrayPointer<Handle<Object> > argv_large_buffer;
8765 Handle<Object>* argv = argv_small_buffer; 8766 Handle<Object>* argv = argv_small_buffer;
8766 if (argc > argv_small_size) { 8767 if (argc > argv_small_size) {
8767 argv = new Handle<Object>[argc]; 8768 argv = new Handle<Object>[argc];
8768 if (argv == NULL) return isolate->StackOverflow(); 8769 if (argv == NULL) return isolate->StackOverflow();
8769 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv); 8770 argv_large_buffer = SmartArrayPointer<Handle<Object> >(argv);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
8835 ASSERT(args.length() == 1); 8836 ASSERT(args.length() == 1);
8836 RUNTIME_ASSERT(!args[0]->IsJSFunction()); 8837 RUNTIME_ASSERT(!args[0]->IsJSFunction());
8837 return *Execution::GetConstructorDelegate(args.at<Object>(0)); 8838 return *Execution::GetConstructorDelegate(args.at<Object>(0));
8838 } 8839 }
8839 8840
8840 8841
8841 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewFunctionContext) { 8842 RUNTIME_FUNCTION(MaybeObject*, Runtime_NewFunctionContext) {
8842 NoHandleAllocation ha; 8843 NoHandleAllocation ha;
8843 ASSERT(args.length() == 1); 8844 ASSERT(args.length() == 1);
8844 8845
8845 CONVERT_CHECKED(JSFunction, function, args[0]); 8846 CONVERT_CHECKED(JSFunction, function, 0);
8846 int length = function->shared()->scope_info()->ContextLength(); 8847 int length = function->shared()->scope_info()->ContextLength();
8847 Object* result; 8848 Object* result;
8848 { MaybeObject* maybe_result = 8849 { MaybeObject* maybe_result =
8849 isolate->heap()->AllocateFunctionContext(length, function); 8850 isolate->heap()->AllocateFunctionContext(length, function);
8850 if (!maybe_result->ToObject(&result)) return maybe_result; 8851 if (!maybe_result->ToObject(&result)) return maybe_result;
8851 } 8852 }
8852 8853
8853 isolate->set_context(Context::cast(result)); 8854 isolate->set_context(Context::cast(result));
8854 8855
8855 return result; // non-failure 8856 return result; // non-failure
(...skipping 761 matching lines...) Expand 10 before | Expand all | Expand 10 after
9617 return maybe_allocation; 9618 return maybe_allocation;
9618 } 9619 }
9619 } 9620 }
9620 9621
9621 9622
9622 // Push an object unto an array of objects if it is not already in the 9623 // Push an object unto an array of objects if it is not already in the
9623 // array. Returns true if the element was pushed on the stack and 9624 // array. Returns true if the element was pushed on the stack and
9624 // false otherwise. 9625 // false otherwise.
9625 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushIfAbsent) { 9626 RUNTIME_FUNCTION(MaybeObject*, Runtime_PushIfAbsent) {
9626 ASSERT(args.length() == 2); 9627 ASSERT(args.length() == 2);
9627 CONVERT_CHECKED(JSArray, array, args[0]); 9628 CONVERT_CHECKED(JSArray, array, 0);
9628 CONVERT_CHECKED(JSObject, element, args[1]); 9629 CONVERT_CHECKED(JSObject, element, 1);
9629 RUNTIME_ASSERT(array->HasFastElements() || array->HasFastSmiOnlyElements()); 9630 RUNTIME_ASSERT(array->HasFastElements() || array->HasFastSmiOnlyElements());
9630 int length = Smi::cast(array->length())->value(); 9631 int length = Smi::cast(array->length())->value();
9631 FixedArray* elements = FixedArray::cast(array->elements()); 9632 FixedArray* elements = FixedArray::cast(array->elements());
9632 for (int i = 0; i < length; i++) { 9633 for (int i = 0; i < length; i++) {
9633 if (elements->get(i) == element) return isolate->heap()->false_value(); 9634 if (elements->get(i) == element) return isolate->heap()->false_value();
9634 } 9635 }
9635 Object* obj; 9636 Object* obj;
9636 // Strict not needed. Used for cycle detection in Array join implementation. 9637 // Strict not needed. Used for cycle detection in Array join implementation.
9637 { MaybeObject* maybe_obj = 9638 { MaybeObject* maybe_obj =
9638 array->SetFastElement(length, element, kNonStrictMode, true); 9639 array->SetFastElement(length, element, kNonStrictMode, true);
(...skipping 565 matching lines...) Expand 10 before | Expand all | Expand 10 after
10204 return *visitor.ToArray(); 10205 return *visitor.ToArray();
10205 } 10206 }
10206 10207
10207 10208
10208 // This will not allocate (flatten the string), but it may run 10209 // This will not allocate (flatten the string), but it may run
10209 // very slowly for very deeply nested ConsStrings. For debugging use only. 10210 // very slowly for very deeply nested ConsStrings. For debugging use only.
10210 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) { 10211 RUNTIME_FUNCTION(MaybeObject*, Runtime_GlobalPrint) {
10211 NoHandleAllocation ha; 10212 NoHandleAllocation ha;
10212 ASSERT(args.length() == 1); 10213 ASSERT(args.length() == 1);
10213 10214
10214 CONVERT_CHECKED(String, string, args[0]); 10215 CONVERT_CHECKED(String, string, 0);
10215 StringInputBuffer buffer(string); 10216 StringInputBuffer buffer(string);
10216 while (buffer.has_more()) { 10217 while (buffer.has_more()) {
10217 uint16_t character = buffer.GetNext(); 10218 uint16_t character = buffer.GetNext();
10218 PrintF("%c", character); 10219 PrintF("%c", character);
10219 } 10220 }
10220 return string; 10221 return string;
10221 } 10222 }
10222 10223
10223 // Moves all own elements of an object, that are below a limit, to positions 10224 // Moves all own elements of an object, that are below a limit, to positions
10224 // starting at zero. All undefined values are placed after non-undefined values, 10225 // starting at zero. All undefined values are placed after non-undefined values,
10225 // and are followed by non-existing element. Does not change the length 10226 // and are followed by non-existing element. Does not change the length
10226 // property. 10227 // property.
10227 // Returns the number of non-undefined elements collected. 10228 // Returns the number of non-undefined elements collected.
10228 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) { 10229 RUNTIME_FUNCTION(MaybeObject*, Runtime_RemoveArrayHoles) {
10229 ASSERT(args.length() == 2); 10230 ASSERT(args.length() == 2);
10230 CONVERT_CHECKED(JSObject, object, args[0]); 10231 CONVERT_CHECKED(JSObject, object, 0);
10231 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); 10232 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
10232 return object->PrepareElementsForSort(limit); 10233 return object->PrepareElementsForSort(limit);
10233 } 10234 }
10234 10235
10235 10236
10236 // Move contents of argument 0 (an array) to argument 1 (an array) 10237 // Move contents of argument 0 (an array) to argument 1 (an array)
10237 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) { 10238 RUNTIME_FUNCTION(MaybeObject*, Runtime_MoveArrayContents) {
10238 ASSERT(args.length() == 2); 10239 ASSERT(args.length() == 2);
10239 CONVERT_CHECKED(JSArray, from, args[0]); 10240 CONVERT_CHECKED(JSArray, from, 0);
10240 CONVERT_CHECKED(JSArray, to, args[1]); 10241 CONVERT_CHECKED(JSArray, to, 1);
10241 FixedArrayBase* new_elements = from->elements(); 10242 FixedArrayBase* new_elements = from->elements();
10242 MaybeObject* maybe_new_map; 10243 MaybeObject* maybe_new_map;
10243 ElementsKind elements_kind; 10244 ElementsKind elements_kind;
10244 if (new_elements->map() == isolate->heap()->fixed_array_map() || 10245 if (new_elements->map() == isolate->heap()->fixed_array_map() ||
10245 new_elements->map() == isolate->heap()->fixed_cow_array_map()) { 10246 new_elements->map() == isolate->heap()->fixed_cow_array_map()) {
10246 elements_kind = FAST_ELEMENTS; 10247 elements_kind = FAST_ELEMENTS;
10247 } else if (new_elements->map() == 10248 } else if (new_elements->map() ==
10248 isolate->heap()->fixed_double_array_map()) { 10249 isolate->heap()->fixed_double_array_map()) {
10249 elements_kind = FAST_DOUBLE_ELEMENTS; 10250 elements_kind = FAST_DOUBLE_ELEMENTS;
10250 } else { 10251 } else {
(...skipping 10 matching lines...) Expand all
10261 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 10262 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
10262 } 10263 }
10263 from->set_length(Smi::FromInt(0)); 10264 from->set_length(Smi::FromInt(0));
10264 return to; 10265 return to;
10265 } 10266 }
10266 10267
10267 10268
10268 // How many elements does this object/array have? 10269 // How many elements does this object/array have?
10269 RUNTIME_FUNCTION(MaybeObject*, Runtime_EstimateNumberOfElements) { 10270 RUNTIME_FUNCTION(MaybeObject*, Runtime_EstimateNumberOfElements) {
10270 ASSERT(args.length() == 1); 10271 ASSERT(args.length() == 1);
10271 CONVERT_CHECKED(JSObject, object, args[0]); 10272 CONVERT_CHECKED(JSObject, object, 0);
10272 HeapObject* elements = object->elements(); 10273 HeapObject* elements = object->elements();
10273 if (elements->IsDictionary()) { 10274 if (elements->IsDictionary()) {
10274 int result = SeededNumberDictionary::cast(elements)->NumberOfElements(); 10275 int result = SeededNumberDictionary::cast(elements)->NumberOfElements();
10275 return Smi::FromInt(result); 10276 return Smi::FromInt(result);
10276 } else if (object->IsJSArray()) { 10277 } else if (object->IsJSArray()) {
10277 return JSArray::cast(object)->length(); 10278 return JSArray::cast(object)->length();
10278 } else { 10279 } else {
10279 return Smi::FromInt(FixedArray::cast(elements)->length()); 10280 return Smi::FromInt(FixedArray::cast(elements)->length());
10280 } 10281 }
10281 } 10282 }
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
10361 // DefineAccessor takes an optional final argument which is the 10362 // DefineAccessor takes an optional final argument which is the
10362 // property attributes (e.g. DONT_ENUM, DONT_DELETE). IMPORTANT: due 10363 // property attributes (e.g. DONT_ENUM, DONT_DELETE). IMPORTANT: due
10363 // to the way accessors are implemented, it is set for both the getter 10364 // to the way accessors are implemented, it is set for both the getter
10364 // and setter on the first call to DefineAccessor and ignored on 10365 // and setter on the first call to DefineAccessor and ignored on
10365 // subsequent calls. 10366 // subsequent calls.
10366 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineAccessor) { 10367 RUNTIME_FUNCTION(MaybeObject*, Runtime_DefineAccessor) {
10367 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5); 10368 RUNTIME_ASSERT(args.length() == 4 || args.length() == 5);
10368 // Compute attributes. 10369 // Compute attributes.
10369 PropertyAttributes attributes = NONE; 10370 PropertyAttributes attributes = NONE;
10370 if (args.length() == 5) { 10371 if (args.length() == 5) {
10371 CONVERT_CHECKED(Smi, attrs, args[4]); 10372 CONVERT_SMI_ARG_CHECKED(value, 4);
10372 int value = attrs->value();
10373 // Only attribute bits should be set. 10373 // Only attribute bits should be set.
10374 ASSERT((value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 10374 ASSERT((value & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
10375 attributes = static_cast<PropertyAttributes>(value); 10375 attributes = static_cast<PropertyAttributes>(value);
10376 } 10376 }
10377 10377
10378 CONVERT_CHECKED(JSObject, obj, args[0]); 10378 CONVERT_CHECKED(JSObject, obj, 0);
10379 CONVERT_CHECKED(String, name, args[1]); 10379 CONVERT_CHECKED(String, name, 1);
10380 CONVERT_CHECKED(Smi, flag, args[2]); 10380 CONVERT_SMI_ARG_CHECKED(flag, 2);
10381 CONVERT_CHECKED(JSFunction, fun, args[3]); 10381 CONVERT_CHECKED(JSFunction, fun, 3);
10382 return obj->DefineAccessor(name, flag->value() == 0, fun, attributes); 10382 return obj->DefineAccessor(name, flag == 0, fun, attributes);
10383 } 10383 }
10384 10384
10385 10385
10386 RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) { 10386 RUNTIME_FUNCTION(MaybeObject*, Runtime_LookupAccessor) {
10387 ASSERT(args.length() == 3); 10387 ASSERT(args.length() == 3);
10388 CONVERT_CHECKED(JSObject, obj, args[0]); 10388 CONVERT_CHECKED(JSObject, obj, 0);
10389 CONVERT_CHECKED(String, name, args[1]); 10389 CONVERT_CHECKED(String, name, 1);
10390 CONVERT_CHECKED(Smi, flag, args[2]); 10390 CONVERT_SMI_ARG_CHECKED(flag, 2);
10391 return obj->LookupAccessor(name, flag->value() == 0); 10391 return obj->LookupAccessor(name, flag == 0);
10392 } 10392 }
10393 10393
10394 10394
10395 #ifdef ENABLE_DEBUGGER_SUPPORT 10395 #ifdef ENABLE_DEBUGGER_SUPPORT
10396 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugBreak) { 10396 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugBreak) {
10397 ASSERT(args.length() == 0); 10397 ASSERT(args.length() == 0);
10398 return Execution::DebugBreakHelper(); 10398 return Execution::DebugBreakHelper();
10399 } 10399 }
10400 10400
10401 10401
10402 // Helper functions for wrapping and unwrapping stack frame ids. 10402 // Helper functions for wrapping and unwrapping stack frame ids.
10403 static Smi* WrapFrameId(StackFrame::Id id) { 10403 static Smi* WrapFrameId(StackFrame::Id id) {
10404 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4))); 10404 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4)));
10405 return Smi::FromInt(id >> 2); 10405 return Smi::FromInt(id >> 2);
10406 } 10406 }
10407 10407
10408 10408
10409 static StackFrame::Id UnwrapFrameId(Smi* wrapped) { 10409 static StackFrame::Id UnwrapFrameId(int wrapped) {
10410 return static_cast<StackFrame::Id>(wrapped->value() << 2); 10410 return static_cast<StackFrame::Id>(wrapped << 2);
10411 } 10411 }
10412 10412
10413 10413
10414 // Adds a JavaScript function as a debug event listener. 10414 // Adds a JavaScript function as a debug event listener.
10415 // args[0]: debug event listener function to set or null or undefined for 10415 // args[0]: debug event listener function to set or null or undefined for
10416 // clearing the event listener function 10416 // clearing the event listener function
10417 // args[1]: object supplied during callback 10417 // args[1]: object supplied during callback
10418 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDebugEventListener) { 10418 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDebugEventListener) {
10419 ASSERT(args.length() == 2); 10419 ASSERT(args.length() == 2);
10420 RUNTIME_ASSERT(args[0]->IsJSFunction() || 10420 RUNTIME_ASSERT(args[0]->IsJSFunction() ||
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
10617 return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL); 10617 return DebugLookupResultValue(isolate->heap(), *obj, *name, &result, NULL);
10618 } 10618 }
10619 return isolate->heap()->undefined_value(); 10619 return isolate->heap()->undefined_value();
10620 } 10620 }
10621 10621
10622 10622
10623 // Return the property type calculated from the property details. 10623 // Return the property type calculated from the property details.
10624 // args[0]: smi with property details. 10624 // args[0]: smi with property details.
10625 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyTypeFromDetails) { 10625 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyTypeFromDetails) {
10626 ASSERT(args.length() == 1); 10626 ASSERT(args.length() == 1);
10627 CONVERT_CHECKED(Smi, details, args[0]); 10627 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10628 PropertyType type = PropertyDetails(details).type(); 10628 return Smi::FromInt(static_cast<int>(details.type()));
10629 return Smi::FromInt(static_cast<int>(type));
10630 } 10629 }
10631 10630
10632 10631
10633 // Return the property attribute calculated from the property details. 10632 // Return the property attribute calculated from the property details.
10634 // args[0]: smi with property details. 10633 // args[0]: smi with property details.
10635 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyAttributesFromDetails) { 10634 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyAttributesFromDetails) {
10636 ASSERT(args.length() == 1); 10635 ASSERT(args.length() == 1);
10637 CONVERT_CHECKED(Smi, details, args[0]); 10636 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10638 PropertyAttributes attributes = PropertyDetails(details).attributes(); 10637 return Smi::FromInt(static_cast<int>(details.attributes()));
10639 return Smi::FromInt(static_cast<int>(attributes));
10640 } 10638 }
10641 10639
10642 10640
10643 // Return the property insertion index calculated from the property details. 10641 // Return the property insertion index calculated from the property details.
10644 // args[0]: smi with property details. 10642 // args[0]: smi with property details.
10645 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyIndexFromDetails) { 10643 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugPropertyIndexFromDetails) {
10646 ASSERT(args.length() == 1); 10644 ASSERT(args.length() == 1);
10647 CONVERT_CHECKED(Smi, details, args[0]); 10645 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10648 int index = PropertyDetails(details).index(); 10646 return Smi::FromInt(details.index());
10649 return Smi::FromInt(index);
10650 } 10647 }
10651 10648
10652 10649
10653 // Return property value from named interceptor. 10650 // Return property value from named interceptor.
10654 // args[0]: object 10651 // args[0]: object
10655 // args[1]: property name 10652 // args[1]: property name
10656 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugNamedInterceptorPropertyValue) { 10653 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugNamedInterceptorPropertyValue) {
10657 HandleScope scope(isolate); 10654 HandleScope scope(isolate);
10658 ASSERT(args.length() == 2); 10655 ASSERT(args.length() == 2);
10659 CONVERT_ARG_CHECKED(JSObject, obj, 0); 10656 CONVERT_ARG_CHECKED(JSObject, obj, 0);
(...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after
11600 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) { 11597 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeCount) {
11601 HandleScope scope(isolate); 11598 HandleScope scope(isolate);
11602 ASSERT(args.length() == 2); 11599 ASSERT(args.length() == 2);
11603 11600
11604 // Check arguments. 11601 // Check arguments.
11605 Object* check; 11602 Object* check;
11606 { MaybeObject* maybe_check = Runtime_CheckExecutionState( 11603 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
11607 RUNTIME_ARGUMENTS(isolate, args)); 11604 RUNTIME_ARGUMENTS(isolate, args));
11608 if (!maybe_check->ToObject(&check)) return maybe_check; 11605 if (!maybe_check->ToObject(&check)) return maybe_check;
11609 } 11606 }
11610 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 11607 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
11611 11608
11612 // Get the frame where the debugging is performed. 11609 // Get the frame where the debugging is performed.
11613 StackFrame::Id id = UnwrapFrameId(wrapped_id); 11610 StackFrame::Id id = UnwrapFrameId(wrapped_id);
11614 JavaScriptFrameIterator it(isolate, id); 11611 JavaScriptFrameIterator it(isolate, id);
11615 JavaScriptFrame* frame = it.frame(); 11612 JavaScriptFrame* frame = it.frame();
11616 11613
11617 // Count the visible scopes. 11614 // Count the visible scopes.
11618 int n = 0; 11615 int n = 0;
11619 for (ScopeIterator it(isolate, frame, 0); 11616 for (ScopeIterator it(isolate, frame, 0);
11620 !it.Done(); 11617 !it.Done();
(...skipping 21 matching lines...) Expand all
11642 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) { 11639 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScopeDetails) {
11643 HandleScope scope(isolate); 11640 HandleScope scope(isolate);
11644 ASSERT(args.length() == 4); 11641 ASSERT(args.length() == 4);
11645 11642
11646 // Check arguments. 11643 // Check arguments.
11647 Object* check; 11644 Object* check;
11648 { MaybeObject* maybe_check = Runtime_CheckExecutionState( 11645 { MaybeObject* maybe_check = Runtime_CheckExecutionState(
11649 RUNTIME_ARGUMENTS(isolate, args)); 11646 RUNTIME_ARGUMENTS(isolate, args));
11650 if (!maybe_check->ToObject(&check)) return maybe_check; 11647 if (!maybe_check->ToObject(&check)) return maybe_check;
11651 } 11648 }
11652 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 11649 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
11653 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); 11650 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]);
11654 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); 11651 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]);
11655 11652
11656 // Get the frame where the debugging is performed. 11653 // Get the frame where the debugging is performed.
11657 StackFrame::Id id = UnwrapFrameId(wrapped_id); 11654 StackFrame::Id id = UnwrapFrameId(wrapped_id);
11658 JavaScriptFrameIterator frame_it(isolate, id); 11655 JavaScriptFrameIterator frame_it(isolate, id);
11659 JavaScriptFrame* frame = frame_it.frame(); 11656 JavaScriptFrame* frame = frame_it.frame();
11660 11657
11661 // Find the requested scope. 11658 // Find the requested scope.
11662 int n = 0; 11659 int n = 0;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
11782 // Convert to JS array and return. 11779 // Convert to JS array and return.
11783 return *isolate->factory()->NewJSArrayWithElements(details); 11780 return *isolate->factory()->NewJSArrayWithElements(details);
11784 } 11781 }
11785 11782
11786 11783
11787 // Sets the disable break state 11784 // Sets the disable break state
11788 // args[0]: disable break state 11785 // args[0]: disable break state
11789 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDisableBreak) { 11786 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetDisableBreak) {
11790 HandleScope scope(isolate); 11787 HandleScope scope(isolate);
11791 ASSERT(args.length() == 1); 11788 ASSERT(args.length() == 1);
11792 CONVERT_BOOLEAN_CHECKED(disable_break, args[0]); 11789 CONVERT_BOOLEAN_CHECKED(disable_break, 0);
11793 isolate->debug()->set_disable_break(disable_break); 11790 isolate->debug()->set_disable_break(disable_break);
11794 return isolate->heap()->undefined_value(); 11791 return isolate->heap()->undefined_value();
11795 } 11792 }
11796 11793
11797 11794
11798 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetBreakLocations) { 11795 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetBreakLocations) {
11799 HandleScope scope(isolate); 11796 HandleScope scope(isolate);
11800 ASSERT(args.length() == 1); 11797 ASSERT(args.length() == 1);
11801 11798
11802 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 11799 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
11966 } 11963 }
11967 11964
11968 11965
11969 // Change the state of break on exceptions. 11966 // Change the state of break on exceptions.
11970 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions. 11967 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions.
11971 // args[1]: Boolean indicating on/off. 11968 // args[1]: Boolean indicating on/off.
11972 RUNTIME_FUNCTION(MaybeObject*, Runtime_ChangeBreakOnException) { 11969 RUNTIME_FUNCTION(MaybeObject*, Runtime_ChangeBreakOnException) {
11973 HandleScope scope(isolate); 11970 HandleScope scope(isolate);
11974 ASSERT(args.length() == 2); 11971 ASSERT(args.length() == 2);
11975 RUNTIME_ASSERT(args[0]->IsNumber()); 11972 RUNTIME_ASSERT(args[0]->IsNumber());
11976 CONVERT_BOOLEAN_CHECKED(enable, args[1]); 11973 CONVERT_BOOLEAN_CHECKED(enable, 1);
11977 11974
11978 // If the number doesn't match an enum value, the ChangeBreakOnException 11975 // If the number doesn't match an enum value, the ChangeBreakOnException
11979 // function will default to affecting caught exceptions. 11976 // function will default to affecting caught exceptions.
11980 ExceptionBreakType type = 11977 ExceptionBreakType type =
11981 static_cast<ExceptionBreakType>(NumberToUint32(args[0])); 11978 static_cast<ExceptionBreakType>(NumberToUint32(args[0]));
11982 // Update break point state. 11979 // Update break point state.
11983 isolate->debug()->ChangeBreakOnException(type, enable); 11980 isolate->debug()->ChangeBreakOnException(type, enable);
11984 return isolate->heap()->undefined_value(); 11981 return isolate->heap()->undefined_value();
11985 } 11982 }
11986 11983
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
12181 // Check the execution state and decode arguments frame and source to be 12178 // Check the execution state and decode arguments frame and source to be
12182 // evaluated. 12179 // evaluated.
12183 ASSERT(args.length() == 6); 12180 ASSERT(args.length() == 6);
12184 Object* check_result; 12181 Object* check_result;
12185 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState( 12182 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState(
12186 RUNTIME_ARGUMENTS(isolate, args)); 12183 RUNTIME_ARGUMENTS(isolate, args));
12187 if (!maybe_check_result->ToObject(&check_result)) { 12184 if (!maybe_check_result->ToObject(&check_result)) {
12188 return maybe_check_result; 12185 return maybe_check_result;
12189 } 12186 }
12190 } 12187 }
12191 CONVERT_CHECKED(Smi, wrapped_id, args[1]); 12188 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
12192 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); 12189 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]);
12193 CONVERT_ARG_CHECKED(String, source, 3); 12190 CONVERT_ARG_CHECKED(String, source, 3);
12194 CONVERT_BOOLEAN_CHECKED(disable_break, args[4]); 12191 CONVERT_BOOLEAN_CHECKED(disable_break, 4);
12195 Handle<Object> additional_context(args[5]); 12192 Handle<Object> additional_context(args[5]);
12196 12193
12197 // Handle the processing of break. 12194 // Handle the processing of break.
12198 DisableBreak disable_break_save(disable_break); 12195 DisableBreak disable_break_save(disable_break);
12199 12196
12200 // Get the frame where the debugging is performed. 12197 // Get the frame where the debugging is performed.
12201 StackFrame::Id id = UnwrapFrameId(wrapped_id); 12198 StackFrame::Id id = UnwrapFrameId(wrapped_id);
12202 JavaScriptFrameIterator it(isolate, id); 12199 JavaScriptFrameIterator it(isolate, id);
12203 JavaScriptFrame* frame = it.frame(); 12200 JavaScriptFrame* frame = it.frame();
12204 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); 12201 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate);
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
12321 // evaluated. 12318 // evaluated.
12322 ASSERT(args.length() == 4); 12319 ASSERT(args.length() == 4);
12323 Object* check_result; 12320 Object* check_result;
12324 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState( 12321 { MaybeObject* maybe_check_result = Runtime_CheckExecutionState(
12325 RUNTIME_ARGUMENTS(isolate, args)); 12322 RUNTIME_ARGUMENTS(isolate, args));
12326 if (!maybe_check_result->ToObject(&check_result)) { 12323 if (!maybe_check_result->ToObject(&check_result)) {
12327 return maybe_check_result; 12324 return maybe_check_result;
12328 } 12325 }
12329 } 12326 }
12330 CONVERT_ARG_CHECKED(String, source, 1); 12327 CONVERT_ARG_CHECKED(String, source, 1);
12331 CONVERT_BOOLEAN_CHECKED(disable_break, args[2]); 12328 CONVERT_BOOLEAN_CHECKED(disable_break, 2);
12332 Handle<Object> additional_context(args[3]); 12329 Handle<Object> additional_context(args[3]);
12333 12330
12334 // Handle the processing of break. 12331 // Handle the processing of break.
12335 DisableBreak disable_break_save(disable_break); 12332 DisableBreak disable_break_save(disable_break);
12336 12333
12337 // Enter the top context from before the debugger was invoked. 12334 // Enter the top context from before the debugger was invoked.
12338 SaveContext save(isolate); 12335 SaveContext save(isolate);
12339 SaveContext* top = &save; 12336 SaveContext* top = &save;
12340 while (top != NULL && *top->context() == *isolate->debug()->debug_context()) { 12337 while (top != NULL && *top->context() == *isolate->debug()->debug_context()) {
12341 top = top->prev(); 12338 top = top->prev();
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
12494 12491
12495 // First perform a full GC in order to avoid references from dead objects. 12492 // First perform a full GC in order to avoid references from dead objects.
12496 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, 12493 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask,
12497 "%DebugReferencedBy"); 12494 "%DebugReferencedBy");
12498 // The heap iterator reserves the right to do a GC to make the heap iterable. 12495 // The heap iterator reserves the right to do a GC to make the heap iterable.
12499 // Due to the GC above we know it won't need to do that, but it seems cleaner 12496 // Due to the GC above we know it won't need to do that, but it seems cleaner
12500 // to get the heap iterator constructed before we start having unprotected 12497 // to get the heap iterator constructed before we start having unprotected
12501 // Object* locals that are not protected by handles. 12498 // Object* locals that are not protected by handles.
12502 12499
12503 // Check parameters. 12500 // Check parameters.
12504 CONVERT_CHECKED(JSObject, target, args[0]); 12501 CONVERT_CHECKED(JSObject, target, 0);
12505 Object* instance_filter = args[1]; 12502 Object* instance_filter = args[1];
12506 RUNTIME_ASSERT(instance_filter->IsUndefined() || 12503 RUNTIME_ASSERT(instance_filter->IsUndefined() ||
12507 instance_filter->IsJSObject()); 12504 instance_filter->IsJSObject());
12508 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]); 12505 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]);
12509 RUNTIME_ASSERT(max_references >= 0); 12506 RUNTIME_ASSERT(max_references >= 0);
12510 12507
12511 12508
12512 // Get the constructor function for context extension and arguments array. 12509 // Get the constructor function for context extension and arguments array.
12513 JSObject* arguments_boilerplate = 12510 JSObject* arguments_boilerplate =
12514 isolate->context()->global_context()->arguments_boilerplate(); 12511 isolate->context()->global_context()->arguments_boilerplate();
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
12582 // args[0]: the constructor to find instances of 12579 // args[0]: the constructor to find instances of
12583 // args[1]: the the maximum number of objects to return 12580 // args[1]: the the maximum number of objects to return
12584 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugConstructedBy) { 12581 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugConstructedBy) {
12585 ASSERT(args.length() == 2); 12582 ASSERT(args.length() == 2);
12586 12583
12587 // First perform a full GC in order to avoid dead objects. 12584 // First perform a full GC in order to avoid dead objects.
12588 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask, 12585 isolate->heap()->CollectAllGarbage(Heap::kMakeHeapIterableMask,
12589 "%DebugConstructedBy"); 12586 "%DebugConstructedBy");
12590 12587
12591 // Check parameters. 12588 // Check parameters.
12592 CONVERT_CHECKED(JSFunction, constructor, args[0]); 12589 CONVERT_CHECKED(JSFunction, constructor, 0);
12593 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]); 12590 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]);
12594 RUNTIME_ASSERT(max_references >= 0); 12591 RUNTIME_ASSERT(max_references >= 0);
12595 12592
12596 // Get the number of referencing objects. 12593 // Get the number of referencing objects.
12597 int count; 12594 int count;
12598 HeapIterator heap_iterator; 12595 HeapIterator heap_iterator;
12599 count = DebugConstructedBy(&heap_iterator, 12596 count = DebugConstructedBy(&heap_iterator,
12600 constructor, 12597 constructor,
12601 max_references, 12598 max_references,
12602 NULL, 12599 NULL,
(...skipping 23 matching lines...) Expand all
12626 } 12623 }
12627 return JSArray::cast(result)->SetContent(instances); 12624 return JSArray::cast(result)->SetContent(instances);
12628 } 12625 }
12629 12626
12630 12627
12631 // Find the effective prototype object as returned by __proto__. 12628 // Find the effective prototype object as returned by __proto__.
12632 // args[0]: the object to find the prototype for. 12629 // args[0]: the object to find the prototype for.
12633 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPrototype) { 12630 RUNTIME_FUNCTION(MaybeObject*, Runtime_DebugGetPrototype) {
12634 ASSERT(args.length() == 1); 12631 ASSERT(args.length() == 1);
12635 12632
12636 CONVERT_CHECKED(JSObject, obj, args[0]); 12633 CONVERT_CHECKED(JSObject, obj, 0);
12637 12634
12638 // Use the __proto__ accessor. 12635 // Use the __proto__ accessor.
12639 return Accessors::ObjectPrototype.getter(obj, NULL); 12636 return Accessors::ObjectPrototype.getter(obj, NULL);
12640 } 12637 }
12641 12638
12642 12639
12643 RUNTIME_FUNCTION(MaybeObject*, Runtime_SystemBreak) { 12640 RUNTIME_FUNCTION(MaybeObject*, Runtime_SystemBreak) {
12644 ASSERT(args.length() == 0); 12641 ASSERT(args.length() == 0);
12645 CPU::DebugBreak(); 12642 CPU::DebugBreak();
12646 return isolate->heap()->undefined_value(); 12643 return isolate->heap()->undefined_value();
(...skipping 29 matching lines...) Expand all
12676 shared->construct_stub()->PrintLn(); 12673 shared->construct_stub()->PrintLn();
12677 #endif // DEBUG 12674 #endif // DEBUG
12678 return isolate->heap()->undefined_value(); 12675 return isolate->heap()->undefined_value();
12679 } 12676 }
12680 12677
12681 12678
12682 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) { 12679 RUNTIME_FUNCTION(MaybeObject*, Runtime_FunctionGetInferredName) {
12683 NoHandleAllocation ha; 12680 NoHandleAllocation ha;
12684 ASSERT(args.length() == 1); 12681 ASSERT(args.length() == 1);
12685 12682
12686 CONVERT_CHECKED(JSFunction, f, args[0]); 12683 CONVERT_CHECKED(JSFunction, f, 0);
12687 return f->shared()->inferred_name(); 12684 return f->shared()->inferred_name();
12688 } 12685 }
12689 12686
12690 12687
12691 static int FindSharedFunctionInfosForScript(HeapIterator* iterator, 12688 static int FindSharedFunctionInfosForScript(HeapIterator* iterator,
12692 Script* script, 12689 Script* script,
12693 FixedArray* buffer) { 12690 FixedArray* buffer) {
12694 AssertNoAllocation no_allocations; 12691 AssertNoAllocation no_allocations;
12695 int counter = 0; 12692 int counter = 0;
12696 int buffer_size = buffer->length(); 12693 int buffer_size = buffer->length();
(...skipping 16 matching lines...) Expand all
12713 return counter; 12710 return counter;
12714 } 12711 }
12715 12712
12716 // For a script finds all SharedFunctionInfo's in the heap that points 12713 // For a script finds all SharedFunctionInfo's in the heap that points
12717 // to this script. Returns JSArray of SharedFunctionInfo wrapped 12714 // to this script. Returns JSArray of SharedFunctionInfo wrapped
12718 // in OpaqueReferences. 12715 // in OpaqueReferences.
12719 RUNTIME_FUNCTION(MaybeObject*, 12716 RUNTIME_FUNCTION(MaybeObject*,
12720 Runtime_LiveEditFindSharedFunctionInfosForScript) { 12717 Runtime_LiveEditFindSharedFunctionInfosForScript) {
12721 ASSERT(args.length() == 1); 12718 ASSERT(args.length() == 1);
12722 HandleScope scope(isolate); 12719 HandleScope scope(isolate);
12723 CONVERT_CHECKED(JSValue, script_value, args[0]); 12720 CONVERT_CHECKED(JSValue, script_value, 0);
12724 12721
12725 12722
12726 Handle<Script> script = Handle<Script>(Script::cast(script_value->value())); 12723 Handle<Script> script = Handle<Script>(Script::cast(script_value->value()));
12727 12724
12728 const int kBufferSize = 32; 12725 const int kBufferSize = 32;
12729 12726
12730 Handle<FixedArray> array; 12727 Handle<FixedArray> array;
12731 array = isolate->factory()->NewFixedArray(kBufferSize); 12728 array = isolate->factory()->NewFixedArray(kBufferSize);
12732 int number; 12729 int number;
12733 { 12730 {
(...skipping 25 matching lines...) Expand all
12759 // For a script calculates compilation information about all its functions. 12756 // For a script calculates compilation information about all its functions.
12760 // The script source is explicitly specified by the second argument. 12757 // The script source is explicitly specified by the second argument.
12761 // The source of the actual script is not used, however it is important that 12758 // The source of the actual script is not used, however it is important that
12762 // all generated code keeps references to this particular instance of script. 12759 // all generated code keeps references to this particular instance of script.
12763 // Returns a JSArray of compilation infos. The array is ordered so that 12760 // Returns a JSArray of compilation infos. The array is ordered so that
12764 // each function with all its descendant is always stored in a continues range 12761 // each function with all its descendant is always stored in a continues range
12765 // with the function itself going first. The root function is a script function. 12762 // with the function itself going first. The root function is a script function.
12766 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) { 12763 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditGatherCompileInfo) {
12767 ASSERT(args.length() == 2); 12764 ASSERT(args.length() == 2);
12768 HandleScope scope(isolate); 12765 HandleScope scope(isolate);
12769 CONVERT_CHECKED(JSValue, script, args[0]); 12766 CONVERT_CHECKED(JSValue, script, 0);
12770 CONVERT_ARG_CHECKED(String, source, 1); 12767 CONVERT_ARG_CHECKED(String, source, 1);
12771 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); 12768 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value()));
12772 12769
12773 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source); 12770 JSArray* result = LiveEdit::GatherCompileInfo(script_handle, source);
12774 12771
12775 if (isolate->has_pending_exception()) { 12772 if (isolate->has_pending_exception()) {
12776 return Failure::Exception(); 12773 return Failure::Exception();
12777 } 12774 }
12778 12775
12779 return result; 12776 return result;
12780 } 12777 }
12781 12778
12782 // Changes the source of the script to a new_source. 12779 // Changes the source of the script to a new_source.
12783 // If old_script_name is provided (i.e. is a String), also creates a copy of 12780 // If old_script_name is provided (i.e. is a String), also creates a copy of
12784 // the script with its original source and sends notification to debugger. 12781 // the script with its original source and sends notification to debugger.
12785 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceScript) { 12782 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditReplaceScript) {
12786 ASSERT(args.length() == 3); 12783 ASSERT(args.length() == 3);
12787 HandleScope scope(isolate); 12784 HandleScope scope(isolate);
12788 CONVERT_CHECKED(JSValue, original_script_value, args[0]); 12785 CONVERT_CHECKED(JSValue, original_script_value, 0);
12789 CONVERT_ARG_CHECKED(String, new_source, 1); 12786 CONVERT_ARG_CHECKED(String, new_source, 1);
12790 Handle<Object> old_script_name(args[2], isolate); 12787 Handle<Object> old_script_name(args[2], isolate);
12791 12788
12792 CONVERT_CHECKED(Script, original_script_pointer, 12789 RUNTIME_ASSERT(original_script_value->value()->IsScript());
12793 original_script_value->value()); 12790 Handle<Script> original_script(Script::cast(original_script_value->value()));
12794 Handle<Script> original_script(original_script_pointer);
12795 12791
12796 Object* old_script = LiveEdit::ChangeScriptSource(original_script, 12792 Object* old_script = LiveEdit::ChangeScriptSource(original_script,
12797 new_source, 12793 new_source,
12798 old_script_name); 12794 old_script_name);
12799 12795
12800 if (old_script->IsScript()) { 12796 if (old_script->IsScript()) {
12801 Handle<Script> script_handle(Script::cast(old_script)); 12797 Handle<Script> script_handle(Script::cast(old_script));
12802 return *(GetScriptWrapper(script_handle)); 12798 return *(GetScriptWrapper(script_handle));
12803 } else { 12799 } else {
12804 return isolate->heap()->null_value(); 12800 return isolate->heap()->null_value();
(...skipping 22 matching lines...) Expand all
12827 // Connects SharedFunctionInfo to another script. 12823 // Connects SharedFunctionInfo to another script.
12828 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSetScript) { 12824 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditFunctionSetScript) {
12829 ASSERT(args.length() == 2); 12825 ASSERT(args.length() == 2);
12830 HandleScope scope(isolate); 12826 HandleScope scope(isolate);
12831 Handle<Object> function_object(args[0], isolate); 12827 Handle<Object> function_object(args[0], isolate);
12832 Handle<Object> script_object(args[1], isolate); 12828 Handle<Object> script_object(args[1], isolate);
12833 12829
12834 if (function_object->IsJSValue()) { 12830 if (function_object->IsJSValue()) {
12835 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); 12831 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object);
12836 if (script_object->IsJSValue()) { 12832 if (script_object->IsJSValue()) {
12837 CONVERT_CHECKED(Script, script, JSValue::cast(*script_object)->value()); 12833 RUNTIME_ASSERT(JSValue::cast(*script_object)->value()->IsScript());
12834 Script* script = Script::cast(JSValue::cast(*script_object)->value());
12838 script_object = Handle<Object>(script, isolate); 12835 script_object = Handle<Object>(script, isolate);
12839 } 12836 }
12840 12837
12841 LiveEdit::SetFunctionScript(function_wrapper, script_object); 12838 LiveEdit::SetFunctionScript(function_wrapper, script_object);
12842 } else { 12839 } else {
12843 // Just ignore this. We may not have a SharedFunctionInfo for some functions 12840 // Just ignore this. We may not have a SharedFunctionInfo for some functions
12844 // and we check it in this function. 12841 // and we check it in this function.
12845 } 12842 }
12846 12843
12847 return isolate->heap()->undefined_value(); 12844 return isolate->heap()->undefined_value();
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
12881 12878
12882 12879
12883 // For array of SharedFunctionInfo's (each wrapped in JSValue) 12880 // For array of SharedFunctionInfo's (each wrapped in JSValue)
12884 // checks that none of them have activations on stacks (of any thread). 12881 // checks that none of them have activations on stacks (of any thread).
12885 // Returns array of the same length with corresponding results of 12882 // Returns array of the same length with corresponding results of
12886 // LiveEdit::FunctionPatchabilityStatus type. 12883 // LiveEdit::FunctionPatchabilityStatus type.
12887 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) { 12884 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCheckAndDropActivations) {
12888 ASSERT(args.length() == 2); 12885 ASSERT(args.length() == 2);
12889 HandleScope scope(isolate); 12886 HandleScope scope(isolate);
12890 CONVERT_ARG_CHECKED(JSArray, shared_array, 0); 12887 CONVERT_ARG_CHECKED(JSArray, shared_array, 0);
12891 CONVERT_BOOLEAN_CHECKED(do_drop, args[1]); 12888 CONVERT_BOOLEAN_CHECKED(do_drop, 1);
12892 12889
12893 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop); 12890 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop);
12894 } 12891 }
12895 12892
12896 // Compares 2 strings line-by-line, then token-wise and returns diff in form 12893 // Compares 2 strings line-by-line, then token-wise and returns diff in form
12897 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list 12894 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list
12898 // of diff chunks. 12895 // of diff chunks.
12899 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCompareStrings) { 12896 RUNTIME_FUNCTION(MaybeObject*, Runtime_LiveEditCompareStrings) {
12900 ASSERT(args.length() == 2); 12897 ASSERT(args.length() == 2);
12901 HandleScope scope(isolate); 12898 HandleScope scope(isolate);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
12942 } 12939 }
12943 12940
12944 12941
12945 // Calls specified function with or without entering the debugger. 12942 // Calls specified function with or without entering the debugger.
12946 // This is used in unit tests to run code as if debugger is entered or simply 12943 // This is used in unit tests to run code as if debugger is entered or simply
12947 // to have a stack with C++ frame in the middle. 12944 // to have a stack with C++ frame in the middle.
12948 RUNTIME_FUNCTION(MaybeObject*, Runtime_ExecuteInDebugContext) { 12945 RUNTIME_FUNCTION(MaybeObject*, Runtime_ExecuteInDebugContext) {
12949 ASSERT(args.length() == 2); 12946 ASSERT(args.length() == 2);
12950 HandleScope scope(isolate); 12947 HandleScope scope(isolate);
12951 CONVERT_ARG_CHECKED(JSFunction, function, 0); 12948 CONVERT_ARG_CHECKED(JSFunction, function, 0);
12952 CONVERT_BOOLEAN_CHECKED(without_debugger, args[1]); 12949 CONVERT_BOOLEAN_CHECKED(without_debugger, 1);
12953 12950
12954 Handle<Object> result; 12951 Handle<Object> result;
12955 bool pending_exception; 12952 bool pending_exception;
12956 { 12953 {
12957 if (without_debugger) { 12954 if (without_debugger) {
12958 result = Execution::Call(function, isolate->global(), 0, NULL, 12955 result = Execution::Call(function, isolate->global(), 0, NULL,
12959 &pending_exception); 12956 &pending_exception);
12960 } else { 12957 } else {
12961 EnterDebugger enter_debugger; 12958 EnterDebugger enter_debugger;
12962 result = Execution::Call(function, isolate->global(), 0, NULL, 12959 result = Execution::Call(function, isolate->global(), 0, NULL,
12963 &pending_exception); 12960 &pending_exception);
12964 } 12961 }
12965 } 12962 }
12966 if (!pending_exception) { 12963 if (!pending_exception) {
12967 return *result; 12964 return *result;
12968 } else { 12965 } else {
12969 return Failure::Exception(); 12966 return Failure::Exception();
12970 } 12967 }
12971 } 12968 }
12972 12969
12973 12970
12974 // Sets a v8 flag. 12971 // Sets a v8 flag.
12975 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) { 12972 RUNTIME_FUNCTION(MaybeObject*, Runtime_SetFlags) {
12976 CONVERT_CHECKED(String, arg, args[0]); 12973 CONVERT_CHECKED(String, arg, 0);
12977 SmartArrayPointer<char> flags = 12974 SmartArrayPointer<char> flags =
12978 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 12975 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
12979 FlagList::SetFlagsFromString(*flags, StrLength(*flags)); 12976 FlagList::SetFlagsFromString(*flags, StrLength(*flags));
12980 return isolate->heap()->undefined_value(); 12977 return isolate->heap()->undefined_value();
12981 } 12978 }
12982 12979
12983 12980
12984 // Performs a GC. 12981 // Performs a GC.
12985 // Presently, it only does a full GC. 12982 // Presently, it only does a full GC.
12986 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectGarbage) { 12983 RUNTIME_FUNCTION(MaybeObject*, Runtime_CollectGarbage) {
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
13250 13247
13251 13248
13252 // Get the script object from script data. NOTE: Regarding performance 13249 // Get the script object from script data. NOTE: Regarding performance
13253 // see the NOTE for GetScriptFromScriptData. 13250 // see the NOTE for GetScriptFromScriptData.
13254 // args[0]: script data for the script to find the source for 13251 // args[0]: script data for the script to find the source for
13255 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScript) { 13252 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetScript) {
13256 HandleScope scope(isolate); 13253 HandleScope scope(isolate);
13257 13254
13258 ASSERT(args.length() == 1); 13255 ASSERT(args.length() == 1);
13259 13256
13260 CONVERT_CHECKED(String, script_name, args[0]); 13257 CONVERT_CHECKED(String, script_name, 0);
13261 13258
13262 // Find the requested script. 13259 // Find the requested script.
13263 Handle<Object> result = 13260 Handle<Object> result =
13264 Runtime_GetScriptFromScriptName(Handle<String>(script_name)); 13261 Runtime_GetScriptFromScriptName(Handle<String>(script_name));
13265 return *result; 13262 return *result;
13266 } 13263 }
13267 13264
13268 13265
13269 // Determines whether the given stack frame should be displayed in 13266 // Determines whether the given stack frame should be displayed in
13270 // a stack trace. The caller is the error constructor that asked 13267 // a stack trace. The caller is the error constructor that asked
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
13390 reinterpret_cast<char*>(args[0]) + args.smi_at(1)); 13387 reinterpret_cast<char*>(args[0]) + args.smi_at(1));
13391 isolate->PrintStack(); 13388 isolate->PrintStack();
13392 OS::Abort(); 13389 OS::Abort();
13393 UNREACHABLE(); 13390 UNREACHABLE();
13394 return NULL; 13391 return NULL;
13395 } 13392 }
13396 13393
13397 13394
13398 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) { 13395 RUNTIME_FUNCTION(MaybeObject*, Runtime_GetFromCache) {
13399 // This is only called from codegen, so checks might be more lax. 13396 // This is only called from codegen, so checks might be more lax.
13400 CONVERT_CHECKED(JSFunctionResultCache, cache, args[0]); 13397 CONVERT_CHECKED(JSFunctionResultCache, cache, 0);
13401 Object* key = args[1]; 13398 Object* key = args[1];
13402 13399
13403 int finger_index = cache->finger_index(); 13400 int finger_index = cache->finger_index();
13404 Object* o = cache->get(finger_index); 13401 Object* o = cache->get(finger_index);
13405 if (o == key) { 13402 if (o == key) {
13406 // The fastest case: hit the same place again. 13403 // The fastest case: hit the same place again.
13407 return cache->get(finger_index + 1); 13404 return cache->get(finger_index + 1);
13408 } 13405 }
13409 13406
13410 for (int i = finger_index - 2; 13407 for (int i = finger_index - 2;
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
13500 arguments, 13497 arguments,
13501 0, 13498 0,
13502 0, 13499 0,
13503 isolate->factory()->undefined_value(), 13500 isolate->factory()->undefined_value(),
13504 isolate->factory()->undefined_value(), 13501 isolate->factory()->undefined_value(),
13505 isolate->factory()->undefined_value()); 13502 isolate->factory()->undefined_value());
13506 } 13503 }
13507 13504
13508 13505
13509 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetType) { 13506 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetType) {
13510 CONVERT_CHECKED(JSMessageObject, message, args[0]); 13507 CONVERT_CHECKED(JSMessageObject, message, 0);
13511 return message->type(); 13508 return message->type();
13512 } 13509 }
13513 13510
13514 13511
13515 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetArguments) { 13512 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetArguments) {
13516 CONVERT_CHECKED(JSMessageObject, message, args[0]); 13513 CONVERT_CHECKED(JSMessageObject, message, 0);
13517 return message->arguments(); 13514 return message->arguments();
13518 } 13515 }
13519 13516
13520 13517
13521 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetStartPosition) { 13518 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetStartPosition) {
13522 CONVERT_CHECKED(JSMessageObject, message, args[0]); 13519 CONVERT_CHECKED(JSMessageObject, message, 0);
13523 return Smi::FromInt(message->start_position()); 13520 return Smi::FromInt(message->start_position());
13524 } 13521 }
13525 13522
13526 13523
13527 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetScript) { 13524 RUNTIME_FUNCTION(MaybeObject*, Runtime_MessageGetScript) {
13528 CONVERT_CHECKED(JSMessageObject, message, args[0]); 13525 CONVERT_CHECKED(JSMessageObject, message, 0);
13529 return message->script(); 13526 return message->script();
13530 } 13527 }
13531 13528
13532 13529
13533 #ifdef DEBUG 13530 #ifdef DEBUG
13534 // ListNatives is ONLY used by the fuzz-natives.js in debug mode 13531 // ListNatives is ONLY used by the fuzz-natives.js in debug mode
13535 // Exclude the code in release mode. 13532 // Exclude the code in release mode.
13536 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) { 13533 RUNTIME_FUNCTION(MaybeObject*, Runtime_ListNatives) {
13537 ASSERT(args.length() == 0); 13534 ASSERT(args.length() == 0);
13538 HandleScope scope; 13535 HandleScope scope;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
13572 #undef ADD_ENTRY 13569 #undef ADD_ENTRY
13573 ASSERT_EQ(index, entry_count); 13570 ASSERT_EQ(index, entry_count);
13574 Handle<JSArray> result = factory->NewJSArrayWithElements(elements); 13571 Handle<JSArray> result = factory->NewJSArrayWithElements(elements);
13575 return *result; 13572 return *result;
13576 } 13573 }
13577 #endif 13574 #endif
13578 13575
13579 13576
13580 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) { 13577 RUNTIME_FUNCTION(MaybeObject*, Runtime_Log) {
13581 ASSERT(args.length() == 2); 13578 ASSERT(args.length() == 2);
13582 CONVERT_CHECKED(String, format, args[0]); 13579 CONVERT_CHECKED(String, format, 0);
13583 CONVERT_CHECKED(JSArray, elms, args[1]); 13580 CONVERT_CHECKED(JSArray, elms, 1);
13584 String::FlatContent format_content = format->GetFlatContent(); 13581 String::FlatContent format_content = format->GetFlatContent();
13585 RUNTIME_ASSERT(format_content.IsAscii()); 13582 RUNTIME_ASSERT(format_content.IsAscii());
13586 Vector<const char> chars = format_content.ToAsciiVector(); 13583 Vector<const char> chars = format_content.ToAsciiVector();
13587 LOGGER->LogRuntime(chars, elms); 13584 LOGGER->LogRuntime(chars, elms);
13588 return isolate->heap()->undefined_value(); 13585 return isolate->heap()->undefined_value();
13589 } 13586 }
13590 13587
13591 13588
13592 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) { 13589 RUNTIME_FUNCTION(MaybeObject*, Runtime_IS_VAR) {
13593 UNREACHABLE(); // implemented as macro in the parser 13590 UNREACHABLE(); // implemented as macro in the parser
13594 return NULL; 13591 return NULL;
13595 } 13592 }
13596 13593
13597 13594
13598 #define ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(Name) \ 13595 #define ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(Name) \
13599 RUNTIME_FUNCTION(MaybeObject*, Runtime_Has##Name) { \ 13596 RUNTIME_FUNCTION(MaybeObject*, Runtime_Has##Name) { \
13600 CONVERT_CHECKED(JSObject, obj, args[0]); \ 13597 CONVERT_CHECKED(JSObject, obj, 0); \
13601 return isolate->heap()->ToBoolean(obj->Has##Name()); \ 13598 return isolate->heap()->ToBoolean(obj->Has##Name()); \
13602 } 13599 }
13603 13600
13604 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastSmiOnlyElements) 13601 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastSmiOnlyElements)
13605 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastElements) 13602 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastElements)
13606 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastDoubleElements) 13603 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(FastDoubleElements)
13607 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(DictionaryElements) 13604 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(DictionaryElements)
13608 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalPixelElements) 13605 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalPixelElements)
13609 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalArrayElements) 13606 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalArrayElements)
13610 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalByteElements) 13607 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalByteElements)
13611 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedByteElements) 13608 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedByteElements)
13612 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalShortElements) 13609 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalShortElements)
13613 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedShortElements) 13610 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedShortElements)
13614 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalIntElements) 13611 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalIntElements)
13615 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedIntElements) 13612 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalUnsignedIntElements)
13616 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalFloatElements) 13613 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalFloatElements)
13617 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalDoubleElements) 13614 ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION(ExternalDoubleElements)
13618 13615
13619 #undef ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION 13616 #undef ELEMENTS_KIND_CHECK_RUNTIME_FUNCTION
13620 13617
13621 13618
13622 RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) { 13619 RUNTIME_FUNCTION(MaybeObject*, Runtime_HaveSameMap) {
13623 ASSERT(args.length() == 2); 13620 ASSERT(args.length() == 2);
13624 CONVERT_CHECKED(JSObject, obj1, args[0]); 13621 CONVERT_CHECKED(JSObject, obj1, 0);
13625 CONVERT_CHECKED(JSObject, obj2, args[1]); 13622 CONVERT_CHECKED(JSObject, obj2, 1);
13626 return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); 13623 return isolate->heap()->ToBoolean(obj1->map() == obj2->map());
13627 } 13624 }
13628 13625
13629 // ---------------------------------------------------------------------------- 13626 // ----------------------------------------------------------------------------
13630 // Implementation of Runtime 13627 // Implementation of Runtime
13631 13628
13632 #define F(name, number_of_args, result_size) \ 13629 #define F(name, number_of_args, result_size) \
13633 { Runtime::k##name, Runtime::RUNTIME, #name, \ 13630 { Runtime::k##name, Runtime::RUNTIME, #name, \
13634 FUNCTION_ADDR(Runtime_##name), number_of_args, result_size }, 13631 FUNCTION_ADDR(Runtime_##name), number_of_args, result_size },
13635 13632
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
13704 // Handle last resort GC and make sure to allow future allocations 13701 // Handle last resort GC and make sure to allow future allocations
13705 // to grow the heap without causing GCs (if possible). 13702 // to grow the heap without causing GCs (if possible).
13706 isolate->counters()->gc_last_resort_from_js()->Increment(); 13703 isolate->counters()->gc_last_resort_from_js()->Increment();
13707 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, 13704 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags,
13708 "Runtime::PerformGC"); 13705 "Runtime::PerformGC");
13709 } 13706 }
13710 } 13707 }
13711 13708
13712 13709
13713 } } // namespace v8::internal 13710 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698