OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 #define __ ACCESS_MASM(masm) | 43 #define __ ACCESS_MASM(masm) |
44 | 44 |
45 | 45 |
46 // Helper function used to load a property from a dictionary backing storage. | 46 // Helper function used to load a property from a dictionary backing storage. |
47 // This function may return false negatives, so miss_label | 47 // This function may return false negatives, so miss_label |
48 // must always call a backup property load that is complete. | 48 // must always call a backup property load that is complete. |
49 // This function is safe to call if the receiver has fast properties, | 49 // This function is safe to call if the receiver has fast properties, |
50 // or if name is not a symbol, and will jump to the miss_label in that case. | 50 // or if name is not a symbol, and will jump to the miss_label in that case. |
51 static void GenerateDictionaryLoad(MacroAssembler* masm, | 51 static void GenerateDictionaryLoad(MacroAssembler* masm, |
52 Label* miss_label, | 52 Label* miss_label, |
| 53 Register receiver, |
| 54 Register name, |
53 Register r0, | 55 Register r0, |
54 Register r1, | 56 Register r1, |
55 Register r2, | 57 Register r2, |
56 Register name, | |
57 DictionaryCheck check_dictionary) { | 58 DictionaryCheck check_dictionary) { |
58 // Register use: | 59 // Register use: |
59 // | 60 // |
| 61 // name - holds the name of the property and is unchanged. |
| 62 // receiver - holds the receiver and is unchanged. |
| 63 // Scratch registers: |
60 // r0 - used to hold the property dictionary. | 64 // r0 - used to hold the property dictionary. |
61 // | 65 // |
62 // r1 - initially the receiver | 66 // r1 - used for the index into the property dictionary |
63 // - used for the index into the property dictionary | |
64 // - holds the result on exit. | 67 // - holds the result on exit. |
65 // | 68 // |
66 // r2 - used to hold the capacity of the property dictionary. | 69 // r2 - used to hold the capacity of the property dictionary. |
67 // | |
68 // name - holds the name of the property and is unchanged. | |
69 | 70 |
70 Label done; | 71 Label done; |
71 | 72 |
72 // Check for the absence of an interceptor. | 73 // Check for the absence of an interceptor. |
73 // Load the map into r0. | 74 // Load the map into r0. |
74 __ mov(r0, FieldOperand(r1, JSObject::kMapOffset)); | 75 __ mov(r0, FieldOperand(receiver, JSObject::kMapOffset)); |
75 // Test the has_named_interceptor bit in the map. | 76 // Test the has_named_interceptor bit in the map. |
76 __ test(FieldOperand(r0, Map::kInstanceAttributesOffset), | 77 __ test(FieldOperand(r0, Map::kInstanceAttributesOffset), |
77 Immediate(1 << (Map::kHasNamedInterceptor + (3 * 8)))); | 78 Immediate(1 << (Map::kHasNamedInterceptor + (3 * 8)))); |
78 | 79 |
79 // Jump to miss if the interceptor bit is set. | 80 // Jump to miss if the interceptor bit is set. |
80 __ j(not_zero, miss_label, not_taken); | 81 __ j(not_zero, miss_label, not_taken); |
81 | 82 |
82 // Bail out if we have a JS global proxy object. | 83 // Bail out if we have a JS global proxy object. |
83 __ movzx_b(r0, FieldOperand(r0, Map::kInstanceTypeOffset)); | 84 __ movzx_b(r0, FieldOperand(r0, Map::kInstanceTypeOffset)); |
84 __ cmp(r0, JS_GLOBAL_PROXY_TYPE); | 85 __ cmp(r0, JS_GLOBAL_PROXY_TYPE); |
85 __ j(equal, miss_label, not_taken); | 86 __ j(equal, miss_label, not_taken); |
86 | 87 |
87 // Possible work-around for http://crbug.com/16276. | 88 // Possible work-around for http://crbug.com/16276. |
88 __ cmp(r0, JS_GLOBAL_OBJECT_TYPE); | 89 __ cmp(r0, JS_GLOBAL_OBJECT_TYPE); |
89 __ j(equal, miss_label, not_taken); | 90 __ j(equal, miss_label, not_taken); |
90 __ cmp(r0, JS_BUILTINS_OBJECT_TYPE); | 91 __ cmp(r0, JS_BUILTINS_OBJECT_TYPE); |
91 __ j(equal, miss_label, not_taken); | 92 __ j(equal, miss_label, not_taken); |
92 | 93 |
93 // Load properties array. | 94 // Load properties array. |
94 __ mov(r0, FieldOperand(r1, JSObject::kPropertiesOffset)); | 95 __ mov(r0, FieldOperand(receiver, JSObject::kPropertiesOffset)); |
95 | 96 |
96 // Check that the properties array is a dictionary. | 97 // Check that the properties array is a dictionary. |
97 if (check_dictionary == CHECK_DICTIONARY) { | 98 if (check_dictionary == CHECK_DICTIONARY) { |
98 __ cmp(FieldOperand(r0, HeapObject::kMapOffset), | 99 __ cmp(FieldOperand(r0, HeapObject::kMapOffset), |
99 Immediate(Factory::hash_table_map())); | 100 Immediate(Factory::hash_table_map())); |
100 __ j(not_equal, miss_label); | 101 __ j(not_equal, miss_label); |
101 } | 102 } |
102 | 103 |
103 // Compute the capacity mask. | 104 // Compute the capacity mask. |
104 const int kCapacityOffset = | 105 const int kCapacityOffset = |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 | 170 |
170 | 171 |
171 // The offset from the inlined patch site to the start of the | 172 // The offset from the inlined patch site to the start of the |
172 // inlined load instruction. It is 7 bytes (test eax, imm) plus | 173 // inlined load instruction. It is 7 bytes (test eax, imm) plus |
173 // 6 bytes (jne slow_label). | 174 // 6 bytes (jne slow_label). |
174 const int LoadIC::kOffsetToLoadInstruction = 13; | 175 const int LoadIC::kOffsetToLoadInstruction = 13; |
175 | 176 |
176 | 177 |
177 void LoadIC::GenerateArrayLength(MacroAssembler* masm) { | 178 void LoadIC::GenerateArrayLength(MacroAssembler* masm) { |
178 // ----------- S t a t e ------------- | 179 // ----------- S t a t e ------------- |
| 180 // -- eax : receiver |
179 // -- ecx : name | 181 // -- ecx : name |
180 // -- esp[0] : return address | 182 // -- esp[0] : return address |
181 // -- esp[4] : receiver | |
182 // ----------------------------------- | 183 // ----------------------------------- |
183 Label miss; | 184 Label miss; |
184 | 185 |
185 __ mov(eax, Operand(esp, kPointerSize)); | |
186 | |
187 StubCompiler::GenerateLoadArrayLength(masm, eax, edx, &miss); | 186 StubCompiler::GenerateLoadArrayLength(masm, eax, edx, &miss); |
188 __ bind(&miss); | 187 __ bind(&miss); |
189 StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); | 188 StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); |
190 } | 189 } |
191 | 190 |
192 | 191 |
193 void LoadIC::GenerateStringLength(MacroAssembler* masm) { | 192 void LoadIC::GenerateStringLength(MacroAssembler* masm) { |
194 // ----------- S t a t e ------------- | 193 // ----------- S t a t e ------------- |
| 194 // -- eax : receiver |
195 // -- ecx : name | 195 // -- ecx : name |
196 // -- esp[0] : return address | 196 // -- esp[0] : return address |
197 // -- esp[4] : receiver | |
198 // ----------------------------------- | 197 // ----------------------------------- |
199 Label miss; | 198 Label miss; |
200 | 199 |
201 __ mov(eax, Operand(esp, kPointerSize)); | |
202 | |
203 StubCompiler::GenerateLoadStringLength(masm, eax, edx, ebx, &miss); | 200 StubCompiler::GenerateLoadStringLength(masm, eax, edx, ebx, &miss); |
204 __ bind(&miss); | 201 __ bind(&miss); |
205 StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); | 202 StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); |
206 } | 203 } |
207 | 204 |
208 | 205 |
209 void LoadIC::GenerateFunctionPrototype(MacroAssembler* masm) { | 206 void LoadIC::GenerateFunctionPrototype(MacroAssembler* masm) { |
210 // ----------- S t a t e ------------- | 207 // ----------- S t a t e ------------- |
| 208 // -- eax : receiver |
211 // -- ecx : name | 209 // -- ecx : name |
212 // -- esp[0] : return address | 210 // -- esp[0] : return address |
213 // -- esp[4] : receiver | |
214 // ----------------------------------- | 211 // ----------------------------------- |
215 Label miss; | 212 Label miss; |
216 | 213 |
217 __ mov(eax, Operand(esp, kPointerSize)); | |
218 | |
219 StubCompiler::GenerateLoadFunctionPrototype(masm, eax, edx, ebx, &miss); | 214 StubCompiler::GenerateLoadFunctionPrototype(masm, eax, edx, ebx, &miss); |
220 __ bind(&miss); | 215 __ bind(&miss); |
221 StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); | 216 StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); |
222 } | 217 } |
223 | 218 |
224 | 219 |
225 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { | 220 void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { |
226 // ----------- S t a t e ------------- | 221 // ----------- S t a t e ------------- |
227 // -- esp[0] : return address | 222 // -- esp[0] : return address |
228 // -- esp[4] : name | 223 // -- esp[4] : name |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
357 __ movzx_b(edx, FieldOperand(ebx, Map::kInstanceSizeOffset)); | 352 __ movzx_b(edx, FieldOperand(ebx, Map::kInstanceSizeOffset)); |
358 __ add(eax, Operand(edx)); | 353 __ add(eax, Operand(edx)); |
359 __ mov(eax, FieldOperand(ecx, eax, times_pointer_size, 0)); | 354 __ mov(eax, FieldOperand(ecx, eax, times_pointer_size, 0)); |
360 __ ret(0); | 355 __ ret(0); |
361 | 356 |
362 // Do a quick inline probe of the receiver's dictionary, if it | 357 // Do a quick inline probe of the receiver's dictionary, if it |
363 // exists. | 358 // exists. |
364 __ bind(&probe_dictionary); | 359 __ bind(&probe_dictionary); |
365 GenerateDictionaryLoad(masm, | 360 GenerateDictionaryLoad(masm, |
366 &slow, | 361 &slow, |
| 362 ecx, |
| 363 eax, |
367 ebx, | 364 ebx, |
368 ecx, | |
369 edx, | 365 edx, |
370 eax, | 366 edi, |
371 DICTIONARY_CHECK_DONE); | 367 DICTIONARY_CHECK_DONE); |
372 GenerateCheckNonObjectOrLoaded(masm, &slow, ecx, edx); | 368 GenerateCheckNonObjectOrLoaded(masm, &slow, edx, ebx); |
373 __ mov(eax, Operand(ecx)); | 369 __ mov(eax, Operand(edx)); |
374 __ IncrementCounter(&Counters::keyed_load_generic_symbol, 1); | 370 __ IncrementCounter(&Counters::keyed_load_generic_symbol, 1); |
375 __ ret(0); | 371 __ ret(0); |
376 | 372 |
377 // If the hash field contains an array index pick it out. The assert checks | 373 // If the hash field contains an array index pick it out. The assert checks |
378 // that the constants for the maximum number of digits for an array index | 374 // that the constants for the maximum number of digits for an array index |
379 // cached in the hash field and the number of bits reserved for it does not | 375 // cached in the hash field and the number of bits reserved for it does not |
380 // conflict. | 376 // conflict. |
381 ASSERT(TenToThe(String::kMaxCachedArrayIndexLength) < | 377 ASSERT(TenToThe(String::kMaxCachedArrayIndexLength) < |
382 (1 << String::kArrayIndexValueBits)); | 378 (1 << String::kArrayIndexValueBits)); |
383 __ bind(&index_string); | 379 __ bind(&index_string); |
(...skipping 610 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
994 // -- ecx : name | 990 // -- ecx : name |
995 // -- edx : receiver | 991 // -- edx : receiver |
996 // -- esp[0] : return address | 992 // -- esp[0] : return address |
997 // -- esp[(argc - n) * 4] : arg[n] (zero-based) | 993 // -- esp[(argc - n) * 4] : arg[n] (zero-based) |
998 // -- ... | 994 // -- ... |
999 // -- esp[(argc + 1) * 4] : receiver | 995 // -- esp[(argc + 1) * 4] : receiver |
1000 // ----------------------------------- | 996 // ----------------------------------- |
1001 | 997 |
1002 // Search dictionary - put result in register edi. | 998 // Search dictionary - put result in register edi. |
1003 __ mov(edi, edx); | 999 __ mov(edi, edx); |
1004 GenerateDictionaryLoad(masm, miss, eax, edi, ebx, ecx, CHECK_DICTIONARY); | 1000 GenerateDictionaryLoad(masm, miss, edx, ecx, eax, edi, ebx, CHECK_DICTIONARY); |
1005 | 1001 |
1006 // Check that the result is not a smi. | 1002 // Check that the result is not a smi. |
1007 __ test(edi, Immediate(kSmiTagMask)); | 1003 __ test(edi, Immediate(kSmiTagMask)); |
1008 __ j(zero, miss, not_taken); | 1004 __ j(zero, miss, not_taken); |
1009 | 1005 |
1010 // Check that the value is a JavaScript function, fetching its map into eax. | 1006 // Check that the value is a JavaScript function, fetching its map into eax. |
1011 __ CmpObjectType(edi, JS_FUNCTION_TYPE, eax); | 1007 __ CmpObjectType(edi, JS_FUNCTION_TYPE, eax); |
1012 __ j(not_equal, miss, not_taken); | 1008 __ j(not_equal, miss, not_taken); |
1013 | 1009 |
1014 // Check that the function has been loaded. eax holds function's map. | 1010 // Check that the function has been loaded. eax holds function's map. |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1143 __ bind(&invoke); | 1139 __ bind(&invoke); |
1144 __ InvokeFunction(edi, actual, JUMP_FUNCTION); | 1140 __ InvokeFunction(edi, actual, JUMP_FUNCTION); |
1145 } | 1141 } |
1146 | 1142 |
1147 | 1143 |
1148 // Defined in ic.cc. | 1144 // Defined in ic.cc. |
1149 Object* LoadIC_Miss(Arguments args); | 1145 Object* LoadIC_Miss(Arguments args); |
1150 | 1146 |
1151 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { | 1147 void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { |
1152 // ----------- S t a t e ------------- | 1148 // ----------- S t a t e ------------- |
| 1149 // -- eax : receiver |
1153 // -- ecx : name | 1150 // -- ecx : name |
1154 // -- esp[0] : return address | 1151 // -- esp[0] : return address |
1155 // -- esp[4] : receiver | |
1156 // ----------------------------------- | 1152 // ----------------------------------- |
1157 | 1153 |
1158 __ mov(eax, Operand(esp, kPointerSize)); | |
1159 | |
1160 // Probe the stub cache. | 1154 // Probe the stub cache. |
1161 Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC, | 1155 Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC, |
1162 NOT_IN_LOOP, | 1156 NOT_IN_LOOP, |
1163 MONOMORPHIC); | 1157 MONOMORPHIC); |
1164 StubCache::GenerateProbe(masm, flags, eax, ecx, ebx, edx); | 1158 StubCache::GenerateProbe(masm, flags, eax, ecx, ebx, edx); |
1165 | 1159 |
1166 // Cache miss: Jump to runtime. | 1160 // Cache miss: Jump to runtime. |
1167 GenerateMiss(masm); | 1161 GenerateMiss(masm); |
1168 } | 1162 } |
1169 | 1163 |
1170 | 1164 |
1171 void LoadIC::GenerateNormal(MacroAssembler* masm) { | 1165 void LoadIC::GenerateNormal(MacroAssembler* masm) { |
1172 // ----------- S t a t e ------------- | 1166 // ----------- S t a t e ------------- |
| 1167 // -- eax : receiver |
1173 // -- ecx : name | 1168 // -- ecx : name |
1174 // -- esp[0] : return address | 1169 // -- esp[0] : return address |
1175 // -- esp[4] : receiver | |
1176 // ----------------------------------- | 1170 // ----------------------------------- |
1177 Label miss, probe, global; | 1171 Label miss, probe, global; |
1178 | 1172 |
1179 __ mov(eax, Operand(esp, kPointerSize)); | |
1180 | |
1181 // Check that the receiver isn't a smi. | 1173 // Check that the receiver isn't a smi. |
1182 __ test(eax, Immediate(kSmiTagMask)); | 1174 __ test(eax, Immediate(kSmiTagMask)); |
1183 __ j(zero, &miss, not_taken); | 1175 __ j(zero, &miss, not_taken); |
1184 | 1176 |
1185 // Check that the receiver is a valid JS object. | 1177 // Check that the receiver is a valid JS object. |
1186 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); | 1178 __ mov(ebx, FieldOperand(eax, HeapObject::kMapOffset)); |
1187 __ movzx_b(edx, FieldOperand(ebx, Map::kInstanceTypeOffset)); | 1179 __ movzx_b(edx, FieldOperand(ebx, Map::kInstanceTypeOffset)); |
1188 __ cmp(edx, FIRST_JS_OBJECT_TYPE); | 1180 __ cmp(edx, FIRST_JS_OBJECT_TYPE); |
1189 __ j(less, &miss, not_taken); | 1181 __ j(less, &miss, not_taken); |
1190 | 1182 |
1191 // If this assert fails, we have to check upper bound too. | 1183 // If this assert fails, we have to check upper bound too. |
1192 ASSERT(LAST_TYPE == JS_FUNCTION_TYPE); | 1184 ASSERT(LAST_TYPE == JS_FUNCTION_TYPE); |
1193 | 1185 |
1194 // Check for access to global object (unlikely). | 1186 // Check for access to global object (unlikely). |
1195 __ cmp(edx, JS_GLOBAL_PROXY_TYPE); | 1187 __ cmp(edx, JS_GLOBAL_PROXY_TYPE); |
1196 __ j(equal, &global, not_taken); | 1188 __ j(equal, &global, not_taken); |
1197 | 1189 |
1198 // Check for non-global object that requires access check. | 1190 // Check for non-global object that requires access check. |
1199 __ movzx_b(ebx, FieldOperand(ebx, Map::kBitFieldOffset)); | 1191 __ movzx_b(ebx, FieldOperand(ebx, Map::kBitFieldOffset)); |
1200 __ test(ebx, Immediate(1 << Map::kIsAccessCheckNeeded)); | 1192 __ test(ebx, Immediate(1 << Map::kIsAccessCheckNeeded)); |
1201 __ j(not_zero, &miss, not_taken); | 1193 __ j(not_zero, &miss, not_taken); |
1202 | 1194 |
1203 // Search the dictionary placing the result in eax. | 1195 // Search the dictionary placing the result in eax. |
1204 __ bind(&probe); | 1196 __ bind(&probe); |
1205 GenerateDictionaryLoad(masm, &miss, edx, eax, ebx, ecx, CHECK_DICTIONARY); | 1197 GenerateDictionaryLoad(masm, |
1206 GenerateCheckNonObjectOrLoaded(masm, &miss, eax, edx); | 1198 &miss, |
| 1199 eax, |
| 1200 ecx, |
| 1201 edx, |
| 1202 edi, |
| 1203 ebx, |
| 1204 CHECK_DICTIONARY); |
| 1205 GenerateCheckNonObjectOrLoaded(masm, &miss, edi, edx); |
| 1206 __ mov(eax, edi); |
1207 __ ret(0); | 1207 __ ret(0); |
1208 | 1208 |
1209 // Global object access: Check access rights. | 1209 // Global object access: Check access rights. |
1210 __ bind(&global); | 1210 __ bind(&global); |
1211 __ CheckAccessGlobalProxy(eax, edx, &miss); | 1211 __ CheckAccessGlobalProxy(eax, edx, &miss); |
1212 __ jmp(&probe); | 1212 __ jmp(&probe); |
1213 | 1213 |
1214 // Cache miss: Restore receiver from stack and jump to runtime. | 1214 // Cache miss: Restore receiver from stack and jump to runtime. |
1215 __ bind(&miss); | 1215 __ bind(&miss); |
1216 __ mov(eax, Operand(esp, 1 * kPointerSize)); | |
1217 GenerateMiss(masm); | 1216 GenerateMiss(masm); |
1218 } | 1217 } |
1219 | 1218 |
1220 | 1219 |
1221 void LoadIC::GenerateMiss(MacroAssembler* masm) { | 1220 void LoadIC::GenerateMiss(MacroAssembler* masm) { |
1222 // ----------- S t a t e ------------- | 1221 // ----------- S t a t e ------------- |
| 1222 // -- eax : receiver |
1223 // -- ecx : name | 1223 // -- ecx : name |
1224 // -- esp[0] : return address | 1224 // -- esp[0] : return address |
1225 // -- esp[4] : receiver | |
1226 // ----------------------------------- | 1225 // ----------------------------------- |
1227 | 1226 |
1228 __ pop(ebx); | 1227 __ pop(ebx); |
1229 __ push(Operand(esp, 0)); // receiver | 1228 __ push(eax); // receiver |
1230 __ push(ecx); // name | 1229 __ push(ecx); // name |
1231 __ push(ebx); // return address | 1230 __ push(ebx); // return address |
1232 | 1231 |
1233 // Perform tail call to the entry. | 1232 // Perform tail call to the entry. |
1234 __ TailCallRuntime(ExternalReference(IC_Utility(kLoadIC_Miss)), 2, 1); | 1233 __ TailCallRuntime(ExternalReference(IC_Utility(kLoadIC_Miss)), 2, 1); |
1235 } | 1234 } |
1236 | 1235 |
1237 | 1236 |
1238 // One byte opcode for test eax,0xXXXXXXXX. | 1237 // One byte opcode for test eax,0xXXXXXXXX. |
1239 static const byte kTestEaxByte = 0xA9; | 1238 static const byte kTestEaxByte = 0xA9; |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1441 __ push(ecx); | 1440 __ push(ecx); |
1442 | 1441 |
1443 // Do tail-call to runtime routine. | 1442 // Do tail-call to runtime routine. |
1444 __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedStoreIC_Miss)), 3, 1); | 1443 __ TailCallRuntime(ExternalReference(IC_Utility(kKeyedStoreIC_Miss)), 3, 1); |
1445 } | 1444 } |
1446 | 1445 |
1447 #undef __ | 1446 #undef __ |
1448 | 1447 |
1449 | 1448 |
1450 } } // namespace v8::internal | 1449 } } // namespace v8::internal |
OLD | NEW |