OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <sstream> | 5 #include <sstream> |
6 | 6 |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 for (Object* type = fun->shared()->function_data(); | 227 for (Object* type = fun->shared()->function_data(); |
228 type->IsFunctionTemplateInfo(); | 228 type->IsFunctionTemplateInfo(); |
229 type = FunctionTemplateInfo::cast(type)->parent_template()) { | 229 type = FunctionTemplateInfo::cast(type)->parent_template()) { |
230 if (type == this) return true; | 230 if (type == this) return true; |
231 } | 231 } |
232 // Didn't find the required type in the inheritance chain. | 232 // Didn't find the required type in the inheritance chain. |
233 return false; | 233 return false; |
234 } | 234 } |
235 | 235 |
236 | 236 |
237 template<typename To> | |
238 static inline To* CheckedCast(void *from) { | |
239 uintptr_t temp = reinterpret_cast<uintptr_t>(from); | |
240 DCHECK(temp % sizeof(To) == 0); | |
241 return reinterpret_cast<To*>(temp); | |
242 } | |
243 | |
244 | |
245 static Handle<Object> PerformCompare(const BitmaskCompareDescriptor& descriptor, | |
246 char* ptr, | |
247 Isolate* isolate) { | |
248 uint32_t bitmask = descriptor.bitmask; | |
249 uint32_t compare_value = descriptor.compare_value; | |
250 uint32_t value; | |
251 switch (descriptor.size) { | |
252 case 1: | |
253 value = static_cast<uint32_t>(*CheckedCast<uint8_t>(ptr)); | |
254 compare_value &= 0xff; | |
255 bitmask &= 0xff; | |
256 break; | |
257 case 2: | |
258 value = static_cast<uint32_t>(*CheckedCast<uint16_t>(ptr)); | |
259 compare_value &= 0xffff; | |
260 bitmask &= 0xffff; | |
261 break; | |
262 case 4: | |
263 value = *CheckedCast<uint32_t>(ptr); | |
264 break; | |
265 default: | |
266 UNREACHABLE(); | |
267 return isolate->factory()->undefined_value(); | |
268 } | |
269 return isolate->factory()->ToBoolean( | |
270 (bitmask & value) == (bitmask & compare_value)); | |
271 } | |
272 | |
273 | |
274 static Handle<Object> PerformCompare(const PointerCompareDescriptor& descriptor, | |
275 char* ptr, | |
276 Isolate* isolate) { | |
277 uintptr_t compare_value = | |
278 reinterpret_cast<uintptr_t>(descriptor.compare_value); | |
279 uintptr_t value = *CheckedCast<uintptr_t>(ptr); | |
280 return isolate->factory()->ToBoolean(compare_value == value); | |
281 } | |
282 | |
283 | |
284 static Handle<Object> GetPrimitiveValue( | |
285 const PrimitiveValueDescriptor& descriptor, | |
286 char* ptr, | |
287 Isolate* isolate) { | |
288 int32_t int32_value = 0; | |
289 switch (descriptor.data_type) { | |
290 case kDescriptorInt8Type: | |
291 int32_value = *CheckedCast<int8_t>(ptr); | |
292 break; | |
293 case kDescriptorUint8Type: | |
294 int32_value = *CheckedCast<uint8_t>(ptr); | |
295 break; | |
296 case kDescriptorInt16Type: | |
297 int32_value = *CheckedCast<int16_t>(ptr); | |
298 break; | |
299 case kDescriptorUint16Type: | |
300 int32_value = *CheckedCast<uint16_t>(ptr); | |
301 break; | |
302 case kDescriptorInt32Type: | |
303 int32_value = *CheckedCast<int32_t>(ptr); | |
304 break; | |
305 case kDescriptorUint32Type: { | |
306 uint32_t value = *CheckedCast<uint32_t>(ptr); | |
307 AllowHeapAllocation allow_gc; | |
308 return isolate->factory()->NewNumberFromUint(value); | |
309 } | |
310 case kDescriptorBoolType: { | |
311 uint8_t byte = *CheckedCast<uint8_t>(ptr); | |
312 return isolate->factory()->ToBoolean( | |
313 byte & (0x1 << descriptor.bool_offset)); | |
314 } | |
315 case kDescriptorFloatType: { | |
316 float value = *CheckedCast<float>(ptr); | |
317 AllowHeapAllocation allow_gc; | |
318 return isolate->factory()->NewNumber(value); | |
319 } | |
320 case kDescriptorDoubleType: { | |
321 double value = *CheckedCast<double>(ptr); | |
322 AllowHeapAllocation allow_gc; | |
323 return isolate->factory()->NewNumber(value); | |
324 } | |
325 } | |
326 AllowHeapAllocation allow_gc; | |
327 return isolate->factory()->NewNumberFromInt(int32_value); | |
328 } | |
329 | |
330 | |
331 static Handle<Object> GetDeclaredAccessorProperty( | |
332 Handle<Object> receiver, | |
333 Handle<DeclaredAccessorInfo> info, | |
334 Isolate* isolate) { | |
335 DisallowHeapAllocation no_gc; | |
336 char* current = reinterpret_cast<char*>(*receiver); | |
337 DeclaredAccessorDescriptorIterator iterator(info->descriptor()); | |
338 while (true) { | |
339 const DeclaredAccessorDescriptorData* data = iterator.Next(); | |
340 switch (data->type) { | |
341 case kDescriptorReturnObject: { | |
342 DCHECK(iterator.Complete()); | |
343 current = *CheckedCast<char*>(current); | |
344 return handle(*CheckedCast<Object*>(current), isolate); | |
345 } | |
346 case kDescriptorPointerDereference: | |
347 DCHECK(!iterator.Complete()); | |
348 current = *reinterpret_cast<char**>(current); | |
349 break; | |
350 case kDescriptorPointerShift: | |
351 DCHECK(!iterator.Complete()); | |
352 current += data->pointer_shift_descriptor.byte_offset; | |
353 break; | |
354 case kDescriptorObjectDereference: { | |
355 DCHECK(!iterator.Complete()); | |
356 Object* object = CheckedCast<Object>(current); | |
357 int field = data->object_dereference_descriptor.internal_field; | |
358 Object* smi = JSObject::cast(object)->GetInternalField(field); | |
359 DCHECK(smi->IsSmi()); | |
360 current = reinterpret_cast<char*>(smi); | |
361 break; | |
362 } | |
363 case kDescriptorBitmaskCompare: | |
364 DCHECK(iterator.Complete()); | |
365 return PerformCompare(data->bitmask_compare_descriptor, | |
366 current, | |
367 isolate); | |
368 case kDescriptorPointerCompare: | |
369 DCHECK(iterator.Complete()); | |
370 return PerformCompare(data->pointer_compare_descriptor, | |
371 current, | |
372 isolate); | |
373 case kDescriptorPrimitiveValue: | |
374 DCHECK(iterator.Complete()); | |
375 return GetPrimitiveValue(data->primitive_value_descriptor, | |
376 current, | |
377 isolate); | |
378 } | |
379 } | |
380 UNREACHABLE(); | |
381 return isolate->factory()->undefined_value(); | |
382 } | |
383 | |
384 | |
385 Handle<FixedArray> JSObject::EnsureWritableFastElements( | 237 Handle<FixedArray> JSObject::EnsureWritableFastElements( |
386 Handle<JSObject> object) { | 238 Handle<JSObject> object) { |
387 DCHECK(object->HasFastSmiOrObjectElements()); | 239 DCHECK(object->HasFastSmiOrObjectElements()); |
388 Isolate* isolate = object->GetIsolate(); | 240 Isolate* isolate = object->GetIsolate(); |
389 Handle<FixedArray> elems(FixedArray::cast(object->elements()), isolate); | 241 Handle<FixedArray> elems(FixedArray::cast(object->elements()), isolate); |
390 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems; | 242 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems; |
391 Handle<FixedArray> writable_elems = isolate->factory()->CopyFixedArrayWithMap( | 243 Handle<FixedArray> writable_elems = isolate->factory()->CopyFixedArrayWithMap( |
392 elems, isolate->factory()->fixed_array_map()); | 244 elems, isolate->factory()->fixed_array_map()); |
393 object->set_elements(*writable_elems); | 245 object->set_elements(*writable_elems); |
394 isolate->counters()->cow_arrays_converted()->Increment(); | 246 isolate->counters()->cow_arrays_converted()->Increment(); |
(...skipping 24 matching lines...) Expand all Loading... |
419 // api style callbacks. | 271 // api style callbacks. |
420 if (structure->IsAccessorInfo()) { | 272 if (structure->IsAccessorInfo()) { |
421 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); | 273 Handle<AccessorInfo> info = Handle<AccessorInfo>::cast(structure); |
422 if (!info->IsCompatibleReceiver(*receiver)) { | 274 if (!info->IsCompatibleReceiver(*receiver)) { |
423 Handle<Object> args[2] = { name, receiver }; | 275 Handle<Object> args[2] = { name, receiver }; |
424 THROW_NEW_ERROR(isolate, | 276 THROW_NEW_ERROR(isolate, |
425 NewTypeError("incompatible_method_receiver", | 277 NewTypeError("incompatible_method_receiver", |
426 HandleVector(args, arraysize(args))), | 278 HandleVector(args, arraysize(args))), |
427 Object); | 279 Object); |
428 } | 280 } |
429 if (structure->IsDeclaredAccessorInfo()) { | |
430 return GetDeclaredAccessorProperty( | |
431 receiver, | |
432 Handle<DeclaredAccessorInfo>::cast(structure), | |
433 isolate); | |
434 } | |
435 | 281 |
436 Handle<ExecutableAccessorInfo> data = | 282 Handle<ExecutableAccessorInfo> data = |
437 Handle<ExecutableAccessorInfo>::cast(structure); | 283 Handle<ExecutableAccessorInfo>::cast(structure); |
438 v8::AccessorNameGetterCallback call_fun = | 284 v8::AccessorNameGetterCallback call_fun = |
439 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); | 285 v8::ToCData<v8::AccessorNameGetterCallback>(data->getter()); |
440 if (call_fun == NULL) return isolate->factory()->undefined_value(); | 286 if (call_fun == NULL) return isolate->factory()->undefined_value(); |
441 | 287 |
442 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); | 288 LOG(isolate, ApiNamedPropertyAccess("load", *holder, *name)); |
443 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); | 289 PropertyCallbackArguments args(isolate, data->data(), *receiver, *holder); |
444 v8::Handle<v8::Value> result = | 290 v8::Handle<v8::Value> result = |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 receiver, Handle<JSReceiver>::cast(setter), value); | 364 receiver, Handle<JSReceiver>::cast(setter), value); |
519 } else { | 365 } else { |
520 if (strict_mode == SLOPPY) return value; | 366 if (strict_mode == SLOPPY) return value; |
521 Handle<Object> args[2] = { name, holder }; | 367 Handle<Object> args[2] = { name, holder }; |
522 THROW_NEW_ERROR( | 368 THROW_NEW_ERROR( |
523 isolate, NewTypeError("no_setter_in_callback", HandleVector(args, 2)), | 369 isolate, NewTypeError("no_setter_in_callback", HandleVector(args, 2)), |
524 Object); | 370 Object); |
525 } | 371 } |
526 } | 372 } |
527 | 373 |
528 // TODO(dcarney): Handle correctly. | |
529 if (structure->IsDeclaredAccessorInfo()) { | |
530 return value; | |
531 } | |
532 | |
533 UNREACHABLE(); | 374 UNREACHABLE(); |
534 return MaybeHandle<Object>(); | 375 return MaybeHandle<Object>(); |
535 } | 376 } |
536 | 377 |
537 | 378 |
538 MaybeHandle<Object> Object::GetPropertyWithDefinedGetter( | 379 MaybeHandle<Object> Object::GetPropertyWithDefinedGetter( |
539 Handle<Object> receiver, | 380 Handle<Object> receiver, |
540 Handle<JSReceiver> getter) { | 381 Handle<JSReceiver> getter) { |
541 Isolate* isolate = getter->GetIsolate(); | 382 Isolate* isolate = getter->GetIsolate(); |
542 Debug* debug = isolate->debug(); | 383 Debug* debug = isolate->debug(); |
(...skipping 2452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2995 if (done && (maybe_attributes.value & READ_ONLY) != 0) { | 2836 if (done && (maybe_attributes.value & READ_ONLY) != 0) { |
2996 return WriteToReadOnlyProperty(it, value, strict_mode); | 2837 return WriteToReadOnlyProperty(it, value, strict_mode); |
2997 } | 2838 } |
2998 } | 2839 } |
2999 break; | 2840 break; |
3000 | 2841 |
3001 case LookupIterator::ACCESSOR: | 2842 case LookupIterator::ACCESSOR: |
3002 if (it->property_details().IsReadOnly()) { | 2843 if (it->property_details().IsReadOnly()) { |
3003 return WriteToReadOnlyProperty(it, value, strict_mode); | 2844 return WriteToReadOnlyProperty(it, value, strict_mode); |
3004 } | 2845 } |
3005 if (it->HolderIsReceiverOrHiddenPrototype() || | 2846 return SetPropertyWithAccessor(it->GetReceiver(), it->name(), value, |
3006 !it->GetAccessors()->IsDeclaredAccessorInfo()) { | 2847 it->GetHolder<JSObject>(), |
3007 return SetPropertyWithAccessor(it->GetReceiver(), it->name(), value, | 2848 it->GetAccessors(), strict_mode); |
3008 it->GetHolder<JSObject>(), | |
3009 it->GetAccessors(), strict_mode); | |
3010 } | |
3011 done = true; | |
3012 break; | |
3013 | 2849 |
3014 case LookupIterator::DATA: | 2850 case LookupIterator::DATA: |
3015 if (it->property_details().IsReadOnly()) { | 2851 if (it->property_details().IsReadOnly()) { |
3016 return WriteToReadOnlyProperty(it, value, strict_mode); | 2852 return WriteToReadOnlyProperty(it, value, strict_mode); |
3017 } | 2853 } |
3018 if (it->HolderIsReceiverOrHiddenPrototype()) { | 2854 if (it->HolderIsReceiverOrHiddenPrototype()) { |
3019 return SetDataProperty(it, value); | 2855 return SetDataProperty(it, value); |
3020 } | 2856 } |
3021 done = true; | 2857 done = true; |
3022 break; | 2858 break; |
(...skipping 9332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12355 isolate); | 12191 isolate); |
12356 if (getter->IsSpecFunction()) { | 12192 if (getter->IsSpecFunction()) { |
12357 // TODO(rossberg): nicer would be to cast to some JSCallable here... | 12193 // TODO(rossberg): nicer would be to cast to some JSCallable here... |
12358 return GetPropertyWithDefinedGetter( | 12194 return GetPropertyWithDefinedGetter( |
12359 receiver, Handle<JSReceiver>::cast(getter)); | 12195 receiver, Handle<JSReceiver>::cast(getter)); |
12360 } | 12196 } |
12361 // Getter is not a function. | 12197 // Getter is not a function. |
12362 return isolate->factory()->undefined_value(); | 12198 return isolate->factory()->undefined_value(); |
12363 } | 12199 } |
12364 | 12200 |
12365 if (structure->IsDeclaredAccessorInfo()) { | |
12366 return GetDeclaredAccessorProperty( | |
12367 receiver, Handle<DeclaredAccessorInfo>::cast(structure), isolate); | |
12368 } | |
12369 | |
12370 UNREACHABLE(); | 12201 UNREACHABLE(); |
12371 return MaybeHandle<Object>(); | 12202 return MaybeHandle<Object>(); |
12372 } | 12203 } |
12373 | 12204 |
12374 | 12205 |
12375 MaybeHandle<Object> JSObject::SetElementWithCallback( | 12206 MaybeHandle<Object> JSObject::SetElementWithCallback( |
12376 Handle<Object> object, Handle<Object> structure, uint32_t index, | 12207 Handle<Object> object, Handle<Object> structure, uint32_t index, |
12377 Handle<Object> value, Handle<JSObject> holder, StrictMode strict_mode) { | 12208 Handle<Object> value, Handle<JSObject> holder, StrictMode strict_mode) { |
12378 Isolate* isolate = holder->GetIsolate(); | 12209 Isolate* isolate = holder->GetIsolate(); |
12379 | 12210 |
(...skipping 30 matching lines...) Expand all Loading... |
12410 } else { | 12241 } else { |
12411 if (strict_mode == SLOPPY) return value; | 12242 if (strict_mode == SLOPPY) return value; |
12412 Handle<Object> key(isolate->factory()->NewNumberFromUint(index)); | 12243 Handle<Object> key(isolate->factory()->NewNumberFromUint(index)); |
12413 Handle<Object> args[2] = { key, holder }; | 12244 Handle<Object> args[2] = { key, holder }; |
12414 THROW_NEW_ERROR( | 12245 THROW_NEW_ERROR( |
12415 isolate, NewTypeError("no_setter_in_callback", HandleVector(args, 2)), | 12246 isolate, NewTypeError("no_setter_in_callback", HandleVector(args, 2)), |
12416 Object); | 12247 Object); |
12417 } | 12248 } |
12418 } | 12249 } |
12419 | 12250 |
12420 // TODO(dcarney): Handle correctly. | |
12421 if (structure->IsDeclaredAccessorInfo()) return value; | |
12422 | |
12423 UNREACHABLE(); | 12251 UNREACHABLE(); |
12424 return MaybeHandle<Object>(); | 12252 return MaybeHandle<Object>(); |
12425 } | 12253 } |
12426 | 12254 |
12427 | 12255 |
12428 bool JSObject::HasFastArgumentsElements() { | 12256 bool JSObject::HasFastArgumentsElements() { |
12429 Heap* heap = GetHeap(); | 12257 Heap* heap = GetHeap(); |
12430 if (!elements()->IsFixedArray()) return false; | 12258 if (!elements()->IsFixedArray()) return false; |
12431 FixedArray* elements = FixedArray::cast(this->elements()); | 12259 FixedArray* elements = FixedArray::cast(this->elements()); |
12432 if (elements->map() != heap->sloppy_arguments_elements_map()) { | 12260 if (elements->map() != heap->sloppy_arguments_elements_map()) { |
(...skipping 4036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16469 template void | 16297 template void |
16470 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::MoveNext(); | 16298 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::MoveNext(); |
16471 | 16299 |
16472 template Object* | 16300 template Object* |
16473 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CurrentKey(); | 16301 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::CurrentKey(); |
16474 | 16302 |
16475 template void | 16303 template void |
16476 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition(); | 16304 OrderedHashTableIterator<JSMapIterator, OrderedHashMap>::Transition(); |
16477 | 16305 |
16478 | 16306 |
16479 DeclaredAccessorDescriptorIterator::DeclaredAccessorDescriptorIterator( | |
16480 DeclaredAccessorDescriptor* descriptor) | |
16481 : array_(descriptor->serialized_data()->GetDataStartAddress()), | |
16482 length_(descriptor->serialized_data()->length()), | |
16483 offset_(0) { | |
16484 } | |
16485 | |
16486 | |
16487 const DeclaredAccessorDescriptorData* | |
16488 DeclaredAccessorDescriptorIterator::Next() { | |
16489 DCHECK(offset_ < length_); | |
16490 uint8_t* ptr = &array_[offset_]; | |
16491 DCHECK(reinterpret_cast<uintptr_t>(ptr) % sizeof(uintptr_t) == 0); | |
16492 const DeclaredAccessorDescriptorData* data = | |
16493 reinterpret_cast<const DeclaredAccessorDescriptorData*>(ptr); | |
16494 offset_ += sizeof(*data); | |
16495 DCHECK(offset_ <= length_); | |
16496 return data; | |
16497 } | |
16498 | |
16499 | |
16500 Handle<DeclaredAccessorDescriptor> DeclaredAccessorDescriptor::Create( | |
16501 Isolate* isolate, | |
16502 const DeclaredAccessorDescriptorData& descriptor, | |
16503 Handle<DeclaredAccessorDescriptor> previous) { | |
16504 int previous_length = | |
16505 previous.is_null() ? 0 : previous->serialized_data()->length(); | |
16506 int length = sizeof(descriptor) + previous_length; | |
16507 Handle<ByteArray> serialized_descriptor = | |
16508 isolate->factory()->NewByteArray(length); | |
16509 Handle<DeclaredAccessorDescriptor> value = | |
16510 isolate->factory()->NewDeclaredAccessorDescriptor(); | |
16511 value->set_serialized_data(*serialized_descriptor); | |
16512 // Copy in the data. | |
16513 { | |
16514 DisallowHeapAllocation no_allocation; | |
16515 uint8_t* array = serialized_descriptor->GetDataStartAddress(); | |
16516 if (previous_length != 0) { | |
16517 uint8_t* previous_array = | |
16518 previous->serialized_data()->GetDataStartAddress(); | |
16519 MemCopy(array, previous_array, previous_length); | |
16520 array += previous_length; | |
16521 } | |
16522 DCHECK(reinterpret_cast<uintptr_t>(array) % sizeof(uintptr_t) == 0); | |
16523 DeclaredAccessorDescriptorData* data = | |
16524 reinterpret_cast<DeclaredAccessorDescriptorData*>(array); | |
16525 *data = descriptor; | |
16526 } | |
16527 return value; | |
16528 } | |
16529 | |
16530 | |
16531 // Check if there is a break point at this code position. | 16307 // Check if there is a break point at this code position. |
16532 bool DebugInfo::HasBreakPoint(int code_position) { | 16308 bool DebugInfo::HasBreakPoint(int code_position) { |
16533 // Get the break point info object for this code position. | 16309 // Get the break point info object for this code position. |
16534 Object* break_point_info = GetBreakPointInfo(code_position); | 16310 Object* break_point_info = GetBreakPointInfo(code_position); |
16535 | 16311 |
16536 // If there is no break point info object or no break points in the break | 16312 // If there is no break point info object or no break points in the break |
16537 // point info object there is no break point at this code position. | 16313 // point info object there is no break point at this code position. |
16538 if (break_point_info->IsUndefined()) return false; | 16314 if (break_point_info->IsUndefined()) return false; |
16539 return BreakPointInfo::cast(break_point_info)->GetBreakPointCount() > 0; | 16315 return BreakPointInfo::cast(break_point_info)->GetBreakPointCount() > 0; |
16540 } | 16316 } |
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
17057 Handle<DependentCode> codes = | 16833 Handle<DependentCode> codes = |
17058 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), | 16834 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), |
17059 DependentCode::kPropertyCellChangedGroup, | 16835 DependentCode::kPropertyCellChangedGroup, |
17060 info->object_wrapper()); | 16836 info->object_wrapper()); |
17061 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16837 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
17062 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16838 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
17063 cell, info->zone()); | 16839 cell, info->zone()); |
17064 } | 16840 } |
17065 | 16841 |
17066 } } // namespace v8::internal | 16842 } } // namespace v8::internal |
OLD | NEW |