v8  3.11.10(node0.8.26)
V8 is Google's open source JavaScript engine
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
handles.cc
Go to the documentation of this file.
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided
11 // with the distribution.
12 // * Neither the name of Google Inc. nor the names of its
13 // contributors may be used to endorse or promote products derived
14 // from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #include "v8.h"
29 
30 #include "accessors.h"
31 #include "api.h"
32 #include "arguments.h"
33 #include "bootstrapper.h"
34 #include "compiler.h"
35 #include "debug.h"
36 #include "execution.h"
37 #include "global-handles.h"
38 #include "natives.h"
39 #include "runtime.h"
40 #include "string-search.h"
41 #include "stub-cache.h"
42 #include "vm-state-inl.h"
43 
44 namespace v8 {
45 namespace internal {
46 
47 
49  Isolate* isolate = Isolate::Current();
51  int n = impl->blocks()->length();
52  if (n == 0) return 0;
53  return ((n - 1) * kHandleBlockSize) + static_cast<int>(
54  (isolate->handle_scope_data()->next - impl->blocks()->last()));
55 }
56 
57 
58 Object** HandleScope::Extend() {
59  Isolate* isolate = Isolate::Current();
61  isolate->handle_scope_data();
62 
63  Object** result = current->next;
64 
65  ASSERT(result == current->limit);
66  // Make sure there's at least one scope on the stack and that the
67  // top of the scope stack isn't a barrier.
68  if (current->level == 0) {
69  Utils::ReportApiFailure("v8::HandleScope::CreateHandle()",
70  "Cannot create a handle without a HandleScope");
71  return NULL;
72  }
73  HandleScopeImplementer* impl = isolate->handle_scope_implementer();
74  // If there's more room in the last block, we use that. This is used
75  // for fast creation of scopes after scope barriers.
76  if (!impl->blocks()->is_empty()) {
77  Object** limit = &impl->blocks()->last()[kHandleBlockSize];
78  if (current->limit != limit) {
79  current->limit = limit;
80  ASSERT(limit - current->next < kHandleBlockSize);
81  }
82  }
83 
84  // If we still haven't found a slot for the handle, we extend the
85  // current handle scope by allocating a new handle block.
86  if (result == current->limit) {
87  // If there's a spare block, use it for growing the current scope.
88  result = impl->GetSpareOrNewBlock();
89  // Add the extension to the global list of blocks, but count the
90  // extension as part of the current scope.
91  impl->blocks()->Add(result);
92  current->limit = &result[kHandleBlockSize];
93  }
94 
95  return result;
96 }
97 
98 
100  ASSERT(isolate == Isolate::Current());
102  isolate->handle_scope_data();
103  isolate->handle_scope_implementer()->DeleteExtensions(current->limit);
104 }
105 
106 
107 void HandleScope::ZapRange(Object** start, Object** end) {
108  ASSERT(end - start <= kHandleBlockSize);
109  for (Object** p = start; p != end; p++) {
110  *reinterpret_cast<Address*>(p) = v8::internal::kHandleZapValue;
111  }
112 }
113 
114 
116  return reinterpret_cast<Address>(
117  &Isolate::Current()->handle_scope_data()->level);
118 }
119 
120 
122  return reinterpret_cast<Address>(
123  &Isolate::Current()->handle_scope_data()->next);
124 }
125 
126 
128  return reinterpret_cast<Address>(
129  &Isolate::Current()->handle_scope_data()->limit);
130 }
131 
132 
134  Handle<JSArray> array) {
135  CALL_HEAP_FUNCTION(content->GetIsolate(),
136  content->AddKeysFromJSArray(*array), FixedArray);
137 }
138 
139 
141  Handle<FixedArray> second) {
142  CALL_HEAP_FUNCTION(first->GetIsolate(),
143  first->UnionOfKeys(*second), FixedArray);
144 }
145 
146 
148  Handle<JSFunction> constructor,
149  Handle<JSGlobalProxy> global) {
151  constructor->GetIsolate(),
152  constructor->GetHeap()->ReinitializeJSGlobalProxy(*constructor, *global),
153  JSGlobalProxy);
154 }
155 
156 
158  // If objects constructed from this function exist then changing
159  // 'estimated_nof_properties' is dangerous since the previous value might
160  // have been compiled into the fast construct stub. More over, the inobject
161  // slack tracking logic might have adjusted the previous value, so even
162  // passing the same value is risky.
163  if (func->shared()->live_objects_may_exist()) return;
164 
165  func->shared()->set_expected_nof_properties(nof);
166  if (func->has_initial_map()) {
167  Handle<Map> new_initial_map =
168  func->GetIsolate()->factory()->CopyMapDropTransitions(
169  Handle<Map>(func->initial_map()));
170  new_initial_map->set_unused_property_fields(nof);
171  func->set_initial_map(*new_initial_map);
172  }
173 }
174 
175 
177  CALL_HEAP_FUNCTION_VOID(func->GetIsolate(),
178  func->SetPrototype(*value));
179 }
180 
181 
182 static int ExpectedNofPropertiesFromEstimate(int estimate) {
183  // If no properties are added in the constructor, they are more likely
184  // to be added later.
185  if (estimate == 0) estimate = 2;
186 
187  // We do not shrink objects that go into a snapshot (yet), so we adjust
188  // the estimate conservatively.
189  if (Serializer::enabled()) return estimate + 2;
190 
191  // Inobject slack tracking will reclaim redundant inobject space later,
192  // so we can afford to adjust the estimate generously.
193  if (FLAG_clever_optimizations) {
194  return estimate + 8;
195  } else {
196  return estimate + 3;
197  }
198 }
199 
200 
202  int estimate) {
203  // See the comment in SetExpectedNofProperties.
204  if (shared->live_objects_may_exist()) return;
205 
206  shared->set_expected_nof_properties(
207  ExpectedNofPropertiesFromEstimate(estimate));
208 }
209 
210 
212  CALL_HEAP_FUNCTION_VOID(string->GetIsolate(), string->TryFlatten());
213 }
214 
215 
217  CALL_HEAP_FUNCTION(string->GetIsolate(), string->TryFlatten(), String);
218 }
219 
220 
222  Handle<Object> prototype) {
223  ASSERT(function->should_have_prototype());
224  CALL_HEAP_FUNCTION(function->GetIsolate(),
226  *prototype,
227  NULL),
228  Object);
229 }
230 
231 
233  Handle<Object> key,
234  Handle<Object> value,
235  PropertyAttributes attributes,
236  StrictModeFlag strict_mode) {
237  Isolate* isolate = Isolate::Current();
239  isolate,
241  isolate, object, key, value, attributes, strict_mode),
242  Object);
243 }
244 
245 
247  Handle<Object> key,
248  Handle<Object> value,
249  PropertyAttributes attributes) {
250  Isolate* isolate = object->GetIsolate();
252  isolate,
254  isolate, object, key, value, attributes),
255  Object);
256 }
257 
258 
260  Handle<Object> key) {
261  Isolate* isolate = object->GetIsolate();
262  CALL_HEAP_FUNCTION(isolate,
263  Runtime::ForceDeleteObjectProperty(isolate, object, key),
264  Object);
265 }
266 
267 
269  Handle<String> key,
270  Handle<Object> value,
271  PropertyAttributes attributes,
272  StrictModeFlag strict_mode) {
273  CALL_HEAP_FUNCTION(object->GetIsolate(),
274  object->SetPropertyWithInterceptor(*key,
275  *value,
276  attributes,
277  strict_mode),
278  Object);
279 }
280 
281 
283  const char* name) {
284  Isolate* isolate = obj->GetIsolate();
285  Handle<String> str = isolate->factory()->LookupAsciiSymbol(name);
286  CALL_HEAP_FUNCTION(isolate, obj->GetProperty(*str), Object);
287 }
288 
289 
291  Handle<Object> key) {
292  Isolate* isolate = Isolate::Current();
293  CALL_HEAP_FUNCTION(isolate,
294  Runtime::GetObjectProperty(isolate, obj, key), Object);
295 }
296 
297 
299  Handle<JSObject> holder,
301  PropertyAttributes* attributes) {
302  Isolate* isolate = receiver->GetIsolate();
303  CALL_HEAP_FUNCTION(isolate,
304  holder->GetPropertyWithInterceptor(*receiver,
305  *name,
306  attributes),
307  Object);
308 }
309 
310 
312  const bool skip_hidden_prototypes = false;
313  CALL_HEAP_FUNCTION(obj->GetIsolate(),
314  obj->SetPrototype(*value, skip_hidden_prototypes), Object);
315 }
316 
317 
319  Isolate* isolate = Isolate::Current();
321  isolate,
322  isolate->heap()->LookupSingleCharacterStringFromCode(index), Object);
323 }
324 
325 
327  int start,
328  int end,
329  PretenureFlag pretenure) {
330  CALL_HEAP_FUNCTION(str->GetIsolate(),
331  str->SubString(start, end, pretenure), String);
332 }
333 
334 
336  Isolate* isolate = obj->GetIsolate();
337  CALL_HEAP_FUNCTION(isolate,
338  isolate->heap()->CopyJSObject(*obj), JSObject);
339 }
340 
341 
343  CALL_HEAP_FUNCTION(obj->GetIsolate(), obj->DefineAccessor(*info), Object);
344 }
345 
346 
347 // Wrappers for scripts are kept alive and cached in weak global
348 // handles referred from foreign objects held by the scripts as long as
349 // they are used. When they are not used anymore, the garbage
350 // collector will call the weak callback on the global handle
351 // associated with the wrapper and get rid of both the wrapper and the
352 // handle.
353 static void ClearWrapperCache(Persistent<v8::Value> handle, void*) {
354  Handle<Object> cache = Utils::OpenHandle(*handle);
355  JSValue* wrapper = JSValue::cast(*cache);
356  Foreign* foreign = Script::cast(wrapper->value())->wrapper();
357  ASSERT(foreign->foreign_address() ==
358  reinterpret_cast<Address>(cache.location()));
359  foreign->set_foreign_address(0);
360  Isolate* isolate = Isolate::Current();
361  isolate->global_handles()->Destroy(cache.location());
362  isolate->counters()->script_wrappers()->Decrement();
363 }
364 
365 
367  if (script->wrapper()->foreign_address() != NULL) {
368  // Return the script wrapper directly from the cache.
369  return Handle<JSValue>(
370  reinterpret_cast<JSValue**>(script->wrapper()->foreign_address()));
371  }
372  Isolate* isolate = Isolate::Current();
373  // Construct a new script wrapper.
374  isolate->counters()->script_wrappers()->Increment();
375  Handle<JSFunction> constructor = isolate->script_function();
376  Handle<JSValue> result =
377  Handle<JSValue>::cast(isolate->factory()->NewJSObject(constructor));
378  result->set_value(*script);
379 
380  // Create a new weak global handle and use it to cache the wrapper
381  // for future use. The cache will automatically be cleared by the
382  // garbage collector when it is not used anymore.
383  Handle<Object> handle = isolate->global_handles()->Create(*result);
384  isolate->global_handles()->MakeWeak(handle.location(), NULL,
385  &ClearWrapperCache);
386  script->wrapper()->set_foreign_address(
387  reinterpret_cast<Address>(handle.location()));
388  return result;
389 }
390 
391 
392 // Init line_ends array with code positions of line ends inside script
393 // source.
395  if (!script->line_ends()->IsUndefined()) return;
396 
397  Isolate* isolate = script->GetIsolate();
398 
399  if (!script->source()->IsString()) {
400  ASSERT(script->source()->IsUndefined());
401  Handle<FixedArray> empty = isolate->factory()->NewFixedArray(0);
402  script->set_line_ends(*empty);
403  ASSERT(script->line_ends()->IsFixedArray());
404  return;
405  }
406 
407  Handle<String> src(String::cast(script->source()), isolate);
408 
409  Handle<FixedArray> array = CalculateLineEnds(src, true);
410 
411  if (*array != isolate->heap()->empty_fixed_array()) {
412  array->set_map(isolate->heap()->fixed_cow_array_map());
413  }
414 
415  script->set_line_ends(*array);
416  ASSERT(script->line_ends()->IsFixedArray());
417 }
418 
419 
420 template <typename SourceChar>
421 static void CalculateLineEnds(Isolate* isolate,
422  List<int>* line_ends,
423  Vector<const SourceChar> src,
424  bool with_last_line) {
425  const int src_len = src.length();
426  StringSearch<char, SourceChar> search(isolate, CStrVector("\n"));
427 
428  // Find and record line ends.
429  int position = 0;
430  while (position != -1 && position < src_len) {
431  position = search.Search(src, position);
432  if (position != -1) {
433  line_ends->Add(position);
434  position++;
435  } else if (with_last_line) {
436  // Even if the last line misses a line end, it is counted.
437  line_ends->Add(src_len);
438  return;
439  }
440  }
441 }
442 
443 
444 Handle<FixedArray> CalculateLineEnds(Handle<String> src,
445  bool with_last_line) {
446  src = FlattenGetString(src);
447  // Rough estimate of line count based on a roughly estimated average
448  // length of (unpacked) code.
449  int line_count_estimate = src->length() >> 4;
450  List<int> line_ends(line_count_estimate);
451  Isolate* isolate = src->GetIsolate();
452  {
453  AssertNoAllocation no_heap_allocation; // ensure vectors stay valid.
454  // Dispatch on type of strings.
455  String::FlatContent content = src->GetFlatContent();
456  ASSERT(content.IsFlat());
457  if (content.IsAscii()) {
458  CalculateLineEnds(isolate,
459  &line_ends,
460  content.ToAsciiVector(),
461  with_last_line);
462  } else {
463  CalculateLineEnds(isolate,
464  &line_ends,
465  content.ToUC16Vector(),
466  with_last_line);
467  }
468  }
469  int line_count = line_ends.length();
470  Handle<FixedArray> array = isolate->factory()->NewFixedArray(line_count);
471  for (int i = 0; i < line_count; i++) {
472  array->set(i, Smi::FromInt(line_ends[i]));
473  }
474  return array;
475 }
476 
477 
478 // Convert code position into line number.
479 int GetScriptLineNumber(Handle<Script> script, int code_pos) {
480  InitScriptLineEnds(script);
481  AssertNoAllocation no_allocation;
482  FixedArray* line_ends_array = FixedArray::cast(script->line_ends());
483  const int line_ends_len = line_ends_array->length();
484 
485  if (!line_ends_len) return -1;
486 
487  if ((Smi::cast(line_ends_array->get(0)))->value() >= code_pos) {
488  return script->line_offset()->value();
489  }
490 
491  int left = 0;
492  int right = line_ends_len;
493  while (int half = (right - left) / 2) {
494  if ((Smi::cast(line_ends_array->get(left + half)))->value() > code_pos) {
495  right -= half;
496  } else {
497  left += half;
498  }
499  }
500  return right + script->line_offset()->value();
501 }
502 
503 // Convert code position into column number.
504 int GetScriptColumnNumber(Handle<Script> script, int code_pos) {
505  int line_number = GetScriptLineNumber(script, code_pos);
506  if (line_number == -1) return -1;
507 
508  AssertNoAllocation no_allocation;
509  FixedArray* line_ends_array = FixedArray::cast(script->line_ends());
510  line_number = line_number - script->line_offset()->value();
511  if (line_number == 0) return code_pos + script->column_offset()->value();
512  int prev_line_end_pos =
513  Smi::cast(line_ends_array->get(line_number - 1))->value();
514  return code_pos - (prev_line_end_pos + 1);
515 }
516 
517 int GetScriptLineNumberSafe(Handle<Script> script, int code_pos) {
518  AssertNoAllocation no_allocation;
519  if (!script->line_ends()->IsUndefined()) {
520  return GetScriptLineNumber(script, code_pos);
521  }
522  // Slow mode: we do not have line_ends. We have to iterate through source.
523  if (!script->source()->IsString()) {
524  return -1;
525  }
526  String* source = String::cast(script->source());
527  int line = 0;
528  int len = source->length();
529  for (int pos = 0; pos < len; pos++) {
530  if (pos == code_pos) {
531  break;
532  }
533  if (source->Get(pos) == '\n') {
534  line++;
535  }
536  }
537  return line;
538 }
539 
540 
541 void CustomArguments::IterateInstance(ObjectVisitor* v) {
542  v->VisitPointers(values_, values_ + ARRAY_SIZE(values_));
543 }
544 
545 
546 // Compute the property keys from the interceptor.
548  Handle<JSObject> object) {
549  Isolate* isolate = receiver->GetIsolate();
550  Handle<InterceptorInfo> interceptor(object->GetNamedInterceptor());
551  CustomArguments args(isolate, interceptor->data(), *receiver, *object);
552  v8::AccessorInfo info(args.end());
553  v8::Handle<v8::Array> result;
554  if (!interceptor->enumerator()->IsUndefined()) {
555  v8::NamedPropertyEnumerator enum_fun =
556  v8::ToCData<v8::NamedPropertyEnumerator>(interceptor->enumerator());
557  LOG(isolate, ApiObjectAccess("interceptor-named-enum", *object));
558  {
559  // Leaving JavaScript.
560  VMState state(isolate, EXTERNAL);
561  result = enum_fun(info);
562  }
563  }
564  return result;
565 }
566 
567 
568 // Compute the element keys from the interceptor.
570  Handle<JSObject> object) {
571  Isolate* isolate = receiver->GetIsolate();
572  Handle<InterceptorInfo> interceptor(object->GetIndexedInterceptor());
573  CustomArguments args(isolate, interceptor->data(), *receiver, *object);
574  v8::AccessorInfo info(args.end());
575  v8::Handle<v8::Array> result;
576  if (!interceptor->enumerator()->IsUndefined()) {
578  v8::ToCData<v8::IndexedPropertyEnumerator>(interceptor->enumerator());
579  LOG(isolate, ApiObjectAccess("interceptor-indexed-enum", *object));
580  {
581  // Leaving JavaScript.
582  VMState state(isolate, EXTERNAL);
583  result = enum_fun(info);
584  }
585  }
586  return result;
587 }
588 
589 
590 static bool ContainsOnlyValidKeys(Handle<FixedArray> array) {
591  int len = array->length();
592  for (int i = 0; i < len; i++) {
593  Object* e = array->get(i);
594  if (!(e->IsString() || e->IsNumber())) return false;
595  }
596  return true;
597 }
598 
599 
602  bool* threw) {
603  USE(ContainsOnlyValidKeys);
604  Isolate* isolate = object->GetIsolate();
605  Handle<FixedArray> content = isolate->factory()->empty_fixed_array();
606  Handle<JSObject> arguments_boilerplate = Handle<JSObject>(
607  isolate->context()->global_context()->arguments_boilerplate(),
608  isolate);
609  Handle<JSFunction> arguments_function = Handle<JSFunction>(
610  JSFunction::cast(arguments_boilerplate->map()->constructor()),
611  isolate);
612 
613  // Only collect keys if access is permitted.
614  for (Handle<Object> p = object;
615  *p != isolate->heap()->null_value();
616  p = Handle<Object>(p->GetPrototype(), isolate)) {
617  if (p->IsJSProxy()) {
618  Handle<JSProxy> proxy(JSProxy::cast(*p), isolate);
619  Handle<Object> args[] = { proxy };
621  isolate->proxy_enumerate(), object, ARRAY_SIZE(args), args, threw);
622  if (*threw) return content;
623  content = AddKeysFromJSArray(content, Handle<JSArray>::cast(names));
624  break;
625  }
626 
627  Handle<JSObject> current(JSObject::cast(*p), isolate);
628 
629  // Check access rights if required.
630  if (current->IsAccessCheckNeeded() &&
631  !isolate->MayNamedAccess(*current,
632  isolate->heap()->undefined_value(),
633  v8::ACCESS_KEYS)) {
634  isolate->ReportFailedAccessCheck(*current, v8::ACCESS_KEYS);
635  break;
636  }
637 
638  // Compute the element keys.
639  Handle<FixedArray> element_keys =
640  isolate->factory()->NewFixedArray(current->NumberOfEnumElements());
641  current->GetEnumElementKeys(*element_keys);
642  content = UnionOfKeys(content, element_keys);
643  ASSERT(ContainsOnlyValidKeys(content));
644 
645  // Add the element keys from the interceptor.
646  if (current->HasIndexedInterceptor()) {
647  v8::Handle<v8::Array> result =
648  GetKeysForIndexedInterceptor(object, current);
649  if (!result.IsEmpty())
650  content = AddKeysFromJSArray(content, v8::Utils::OpenHandle(*result));
651  ASSERT(ContainsOnlyValidKeys(content));
652  }
653 
654  // We can cache the computed property keys if access checks are
655  // not needed and no interceptors are involved.
656  //
657  // We do not use the cache if the object has elements and
658  // therefore it does not make sense to cache the property names
659  // for arguments objects. Arguments objects will always have
660  // elements.
661  // Wrapped strings have elements, but don't have an elements
662  // array or dictionary. So the fast inline test for whether to
663  // use the cache says yes, so we should not create a cache.
664  bool cache_enum_keys =
665  ((current->map()->constructor() != *arguments_function) &&
666  !current->IsJSValue() &&
667  !current->IsAccessCheckNeeded() &&
668  !current->HasNamedInterceptor() &&
669  !current->HasIndexedInterceptor());
670  // Compute the property keys and cache them if possible.
671  content =
672  UnionOfKeys(content, GetEnumPropertyKeys(current, cache_enum_keys));
673  ASSERT(ContainsOnlyValidKeys(content));
674 
675  // Add the property keys from the interceptor.
676  if (current->HasNamedInterceptor()) {
677  v8::Handle<v8::Array> result =
678  GetKeysForNamedInterceptor(object, current);
679  if (!result.IsEmpty())
680  content = AddKeysFromJSArray(content, v8::Utils::OpenHandle(*result));
681  ASSERT(ContainsOnlyValidKeys(content));
682  }
683 
684  // If we only want local properties we bail out after the first
685  // iteration.
686  if (type == LOCAL_ONLY)
687  break;
688  }
689  return content;
690 }
691 
692 
694  Isolate* isolate = object->GetIsolate();
695  isolate->counters()->for_in()->Increment();
696  Handle<FixedArray> elements =
697  GetKeysInFixedArrayFor(object, INCLUDE_PROTOS, threw);
698  return isolate->factory()->NewJSArrayWithElements(elements);
699 }
700 
701 
703  bool cache_result) {
704  int index = 0;
705  Isolate* isolate = object->GetIsolate();
706  if (object->HasFastProperties()) {
707  if (object->map()->instance_descriptors()->HasEnumCache()) {
708  isolate->counters()->enum_cache_hits()->Increment();
709  DescriptorArray* desc = object->map()->instance_descriptors();
711  isolate);
712  }
713  isolate->counters()->enum_cache_misses()->Increment();
714  Handle<Map> map(object->map());
715  int num_enum = object->NumberOfLocalProperties(DONT_ENUM);
716 
717  Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum);
718  Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum);
719 
720  Handle<FixedArray> indices;
721  Handle<FixedArray> sort_array2;
722 
723  if (cache_result) {
724  indices = isolate->factory()->NewFixedArray(num_enum);
725  sort_array2 = isolate->factory()->NewFixedArray(num_enum);
726  }
727 
729  Handle<DescriptorArray>(object->map()->instance_descriptors(), isolate);
730 
731  for (int i = 0; i < descs->number_of_descriptors(); i++) {
732  if (descs->IsProperty(i) && !descs->GetDetails(i).IsDontEnum()) {
733  storage->set(index, descs->GetKey(i));
734  PropertyDetails details = descs->GetDetails(i);
735  sort_array->set(index, Smi::FromInt(details.index()));
736  if (!indices.is_null()) {
737  if (details.type() != FIELD) {
738  indices = Handle<FixedArray>();
739  sort_array2 = Handle<FixedArray>();
740  } else {
741  int field_index = Descriptor::IndexFromValue(descs->GetValue(i));
742  if (field_index >= map->inobject_properties()) {
743  field_index = -(field_index - map->inobject_properties() + 1);
744  }
745  indices->set(index, Smi::FromInt(field_index));
746  sort_array2->set(index, Smi::FromInt(details.index()));
747  }
748  }
749  index++;
750  }
751  }
752  storage->SortPairs(*sort_array, sort_array->length());
753  if (!indices.is_null()) {
754  indices->SortPairs(*sort_array2, sort_array2->length());
755  }
756  if (cache_result) {
757  Handle<FixedArray> bridge_storage =
758  isolate->factory()->NewFixedArray(
760  DescriptorArray* desc = object->map()->instance_descriptors();
761  desc->SetEnumCache(*bridge_storage,
762  *storage,
763  indices.is_null() ? Object::cast(Smi::FromInt(0))
764  : Object::cast(*indices));
765  }
766  ASSERT(storage->length() == index);
767  return storage;
768  } else {
769  int num_enum = object->NumberOfLocalProperties(DONT_ENUM);
770  Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum);
771  Handle<FixedArray> sort_array = isolate->factory()->NewFixedArray(num_enum);
772  object->property_dictionary()->CopyEnumKeysTo(*storage, *sort_array);
773  return storage;
774  }
775 }
776 
777 
779  Handle<Object> key) {
780  CALL_HEAP_FUNCTION(table->GetIsolate(),
781  table->Add(*key),
782  ObjectHashSet);
783 }
784 
785 
787  Handle<Object> key) {
788  CALL_HEAP_FUNCTION(table->GetIsolate(),
789  table->Remove(*key),
790  ObjectHashSet);
791 }
792 
793 
795  Handle<Object> key,
796  Handle<Object> value) {
797  CALL_HEAP_FUNCTION(table->GetIsolate(),
798  table->Put(*key, *value),
800 }
801 
802 
803 // This method determines the type of string involved and then gets the UTF8
804 // length of the string. It doesn't flatten the string and has log(n) recursion
805 // for a string of length n. If the failure flag gets set, then we have to
806 // flatten the string and retry. Failures are caused by surrogate pairs in deep
807 // cons strings.
808 
809 // Single surrogate characters that are encountered in the UTF-16 character
810 // sequence of the input string get counted as 3 UTF-8 bytes, because that
811 // is the way that WriteUtf8 will encode them. Surrogate pairs are counted and
812 // encoded as one 4-byte UTF-8 sequence.
813 
814 // This function conceptually uses recursion on the two halves of cons strings.
815 // However, in order to avoid the recursion going too deep it recurses on the
816 // second string of the cons, but iterates on the first substring (by manually
817 // eliminating it as a tail recursion). This means it counts the UTF-8 length
818 // from the end to the start, which makes no difference to the total.
819 
820 // Surrogate pairs are recognized even if they are split across two sides of a
821 // cons, which complicates the implementation somewhat. Therefore, too deep
822 // recursion cannot always be avoided. This case is detected, and the failure
823 // flag is set, a signal to the caller that the string should be flattened and
824 // the operation retried.
826  int from,
827  int to,
828  bool followed_by_surrogate,
829  int max_recursion,
830  bool* failure,
831  bool* starts_with_surrogate) {
832  if (from == to) return 0;
833  int total = 0;
834  bool dummy;
835  while (true) {
836  if (input->IsAsciiRepresentation()) {
837  *starts_with_surrogate = false;
838  return total + to - from;
839  }
840  switch (StringShape(input).representation_tag()) {
841  case kConsStringTag: {
842  ConsString* str = ConsString::cast(input);
843  String* first = str->first();
844  String* second = str->second();
845  int first_length = first->length();
846  if (first_length - from > to - first_length) {
847  if (first_length < to) {
848  // Right hand side is shorter. No need to check the recursion depth
849  // since this can only happen log(n) times.
850  bool right_starts_with_surrogate = false;
851  total += Utf8LengthHelper(second,
852  0,
853  to - first_length,
854  followed_by_surrogate,
855  max_recursion - 1,
856  failure,
857  &right_starts_with_surrogate);
858  if (*failure) return 0;
859  followed_by_surrogate = right_starts_with_surrogate;
860  input = first;
861  to = first_length;
862  } else {
863  // We only need the left hand side.
864  input = first;
865  }
866  } else {
867  if (first_length > from) {
868  // Left hand side is shorter.
869  if (first->IsAsciiRepresentation()) {
870  total += first_length - from;
871  *starts_with_surrogate = false;
872  starts_with_surrogate = &dummy;
873  input = second;
874  from = 0;
875  to -= first_length;
876  } else if (second->IsAsciiRepresentation()) {
877  followed_by_surrogate = false;
878  total += to - first_length;
879  input = first;
880  to = first_length;
881  } else if (max_recursion > 0) {
882  bool right_starts_with_surrogate = false;
883  // Recursing on the long one. This may fail.
884  total += Utf8LengthHelper(second,
885  0,
886  to - first_length,
887  followed_by_surrogate,
888  max_recursion - 1,
889  failure,
890  &right_starts_with_surrogate);
891  if (*failure) return 0;
892  input = first;
893  to = first_length;
894  followed_by_surrogate = right_starts_with_surrogate;
895  } else {
896  *failure = true;
897  return 0;
898  }
899  } else {
900  // We only need the right hand side.
901  input = second;
902  from = 0;
903  to -= first_length;
904  }
905  }
906  continue;
907  }
908  case kExternalStringTag:
909  case kSeqStringTag: {
910  Vector<const uc16> vector = input->GetFlatContent().ToUC16Vector();
911  const uc16* p = vector.start();
913  for (int i = from; i < to; i++) {
914  uc16 c = p[i];
915  total += unibrow::Utf8::Length(c, previous);
916  previous = c;
917  }
918  if (to - from > 0) {
919  if (unibrow::Utf16::IsLeadSurrogate(previous) &&
920  followed_by_surrogate) {
922  }
923  if (unibrow::Utf16::IsTrailSurrogate(p[from])) {
924  *starts_with_surrogate = true;
925  }
926  }
927  return total;
928  }
929  case kSlicedStringTag: {
930  SlicedString* str = SlicedString::cast(input);
931  int offset = str->offset();
932  input = str->parent();
933  from += offset;
934  to += offset;
935  continue;
936  }
937  default:
938  break;
939  }
940  UNREACHABLE();
941  return 0;
942  }
943  return 0;
944 }
945 
946 
948  bool dummy;
949  bool failure;
950  int len;
951  const int kRecursionBudget = 100;
952  do {
953  failure = false;
954  len = Utf8LengthHelper(
955  *str, 0, str->length(), false, kRecursionBudget, &failure, &dummy);
956  if (failure) FlattenString(str);
957  } while (failure);
958  return len;
959 }
960 
961 } } // namespace v8::internal
byte * Address
Definition: globals.h:172
int Utf8Length(Handle< String > str)
Definition: handles.cc:947
void SetEnumCache(FixedArray *bridge_storage, FixedArray *new_cache, Object *new_index_cache)
Definition: objects.cc:5782
Handle< Array >(* NamedPropertyEnumerator)(const AccessorInfo &info)
Definition: v8.h:2056
void FlattenString(Handle< String > string)
Definition: handles.cc:211
static int NumberOfHandles()
Definition: handles.cc:48
Handle< JSObject > NewJSObject(Handle< JSFunction > constructor, PretenureFlag pretenure=NOT_TENURED)
Definition: factory.cc:973
static Address current_level_address()
Definition: handles.cc:115
static String * cast(Object *obj)
Handle< FixedArray > AddKeysFromJSArray(Handle< FixedArray > content, Handle< JSArray > array)
Definition: handles.cc:133
HandleScopeImplementer * handle_scope_implementer()
Definition: isolate.h:849
Handle< Object > SetPropertyWithInterceptor(Handle< JSObject > object, Handle< String > key, Handle< Object > value, PropertyAttributes attributes, StrictModeFlag strict_mode)
Definition: handles.cc:268
static Smi * FromInt(int value)
Definition: objects-inl.h:973
v8::Handle< v8::Array > GetKeysForIndexedInterceptor(Handle< JSReceiver > receiver, Handle< JSObject > object)
Definition: handles.cc:569
#define LOG(isolate, Call)
Definition: log.h:81
void ReportFailedAccessCheck(JSObject *receiver, v8::AccessType type)
Definition: isolate.cc:747
value format" "after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false, "print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false, "print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false, "report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true, "garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true, "flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true, "use incremental marking") DEFINE_bool(incremental_marking_steps, true, "do incremental marking steps") DEFINE_bool(trace_incremental_marking, false, "trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true, "Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false, "Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true, "use inline caching") DEFINE_bool(native_code_counters, false, "generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false, "Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true, "Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false, "Never perform compaction on full GC-testing only") DEFINE_bool(compact_code_space, true, "Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true, "Flush inline caches prior to mark compact collection and" "flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0, "Default seed for initializing random generator" "(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true, "allows verbose printing") DEFINE_bool(allow_natives_syntax, false, "allow natives syntax") DEFINE_bool(trace_sim, false, "Trace simulator execution") DEFINE_bool(check_icache, false, "Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0, "Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8, "Stack alingment in bytes in simulator(4 or 8, 8 is default)") DEFINE_bool(trace_exception, false, "print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false, "preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true, "randomize hashes to avoid predictable hash collisions" "(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0, "Fixed seed to use to hash property keys(0 means random)" "(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false, "activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true, "generate optimized regexp code") DEFINE_bool(testing_bool_flag, true, "testing_bool_flag") DEFINE_int(testing_int_flag, 13, "testing_int_flag") DEFINE_float(testing_float_flag, 2.5, "float-flag") DEFINE_string(testing_string_flag, "Hello, world!", "string-flag") DEFINE_int(testing_prng_seed, 42, "Seed used for threading test randomness") DEFINE_string(testing_serialization_file, "/tmp/serdes", "file in which to serialize heap") DEFINE_bool(help, false, "Print usage message, including flags, on console") DEFINE_bool(dump_counters, false, "Dump counters on exit") DEFINE_string(map_counters, "", "Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT, "Pass all remaining arguments to the script.Alias for\"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#43"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2#define FLAG_MODE_DEFINE_DEFAULTS#1"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flag-definitions.h"1#define FLAG_FULL(ftype, ctype, nam, def, cmt)#define FLAG_READONLY(ftype, ctype, nam, def, cmt)#define DEFINE_implication(whenflag, thenflag)#define DEFINE_bool(nam, def, cmt)#define DEFINE_int(nam, def, cmt)#define DEFINE_float(nam, def, cmt)#define DEFINE_string(nam, def, cmt)#define DEFINE_args(nam, def, cmt)#define FLAG DEFINE_bool(use_strict, false,"enforce strict mode") DEFINE_bool(es5_readonly, false,"activate correct semantics for inheriting readonliness") DEFINE_bool(es52_globals, false,"activate new semantics for global var declarations") DEFINE_bool(harmony_typeof, false,"enable harmony semantics for typeof") DEFINE_bool(harmony_scoping, false,"enable harmony block scoping") DEFINE_bool(harmony_modules, false,"enable harmony modules (implies block scoping)") DEFINE_bool(harmony_proxies, false,"enable harmony proxies") DEFINE_bool(harmony_collections, false,"enable harmony collections (sets, maps, and weak maps)") DEFINE_bool(harmony, false,"enable all harmony features (except typeof)") DEFINE_implication(harmony, harmony_scoping) DEFINE_implication(harmony, harmony_modules) DEFINE_implication(harmony, harmony_proxies) DEFINE_implication(harmony, harmony_collections) DEFINE_implication(harmony_modules, harmony_scoping) DEFINE_bool(packed_arrays, false,"optimizes arrays that have no holes") DEFINE_bool(smi_only_arrays, true,"tracks arrays with only smi values") DEFINE_bool(clever_optimizations, true,"Optimize object size, Array shift, DOM strings and string +") DEFINE_bool(unbox_double_arrays, true,"automatically unbox arrays of doubles") DEFINE_bool(string_slices, true,"use string slices") DEFINE_bool(crankshaft, true,"use crankshaft") DEFINE_string(hydrogen_filter,"","optimization filter") DEFINE_bool(use_range, true,"use hydrogen range analysis") DEFINE_bool(eliminate_dead_phis, true,"eliminate dead phis") DEFINE_bool(use_gvn, true,"use hydrogen global value numbering") DEFINE_bool(use_canonicalizing, true,"use hydrogen instruction canonicalizing") DEFINE_bool(use_inlining, true,"use function inlining") DEFINE_int(max_inlined_source_size, 600,"maximum source size in bytes considered for a single inlining") DEFINE_int(max_inlined_nodes, 196,"maximum number of AST nodes considered for a single inlining") DEFINE_int(max_inlined_nodes_cumulative, 196,"maximum cumulative number of AST nodes considered for inlining") DEFINE_bool(loop_invariant_code_motion, true,"loop invariant code motion") DEFINE_bool(collect_megamorphic_maps_from_stub_cache, true,"crankshaft harvests type feedback from stub cache") DEFINE_bool(hydrogen_stats, false,"print statistics for hydrogen") DEFINE_bool(trace_hydrogen, false,"trace generated hydrogen to file") DEFINE_string(trace_phase,"Z","trace generated IR for specified phases") DEFINE_bool(trace_inlining, false,"trace inlining decisions") DEFINE_bool(trace_alloc, false,"trace register allocator") DEFINE_bool(trace_all_uses, false,"trace all use positions") DEFINE_bool(trace_range, false,"trace range analysis") DEFINE_bool(trace_gvn, false,"trace global value numbering") DEFINE_bool(trace_representation, false,"trace representation types") DEFINE_bool(stress_pointer_maps, false,"pointer map for every instruction") DEFINE_bool(stress_environments, false,"environment for every instruction") DEFINE_int(deopt_every_n_times, 0,"deoptimize every n times a deopt point is passed") DEFINE_bool(trap_on_deopt, false,"put a break point before deoptimizing") DEFINE_bool(deoptimize_uncommon_cases, true,"deoptimize uncommon cases") DEFINE_bool(polymorphic_inlining, true,"polymorphic inlining") DEFINE_bool(use_osr, true,"use on-stack replacement") DEFINE_bool(array_bounds_checks_elimination, false,"perform array bounds checks elimination") DEFINE_bool(array_index_dehoisting, false,"perform array index dehoisting") DEFINE_bool(trace_osr, false,"trace on-stack replacement") DEFINE_int(stress_runs, 0,"number of stress runs") DEFINE_bool(optimize_closures, true,"optimize closures") DEFINE_bool(inline_construct, true,"inline constructor calls") DEFINE_bool(inline_arguments, true,"inline functions with arguments object") DEFINE_int(loop_weight, 1,"loop weight for representation inference") DEFINE_bool(optimize_for_in, true,"optimize functions containing for-in loops") DEFINE_bool(experimental_profiler, true,"enable all profiler experiments") DEFINE_bool(watch_ic_patching, false,"profiler considers IC stability") DEFINE_int(frame_count, 1,"number of stack frames inspected by the profiler") DEFINE_bool(self_optimization, false,"primitive functions trigger their own optimization") DEFINE_bool(direct_self_opt, false,"call recompile stub directly when self-optimizing") DEFINE_bool(retry_self_opt, false,"re-try self-optimization if it failed") DEFINE_bool(count_based_interrupts, false,"trigger profiler ticks based on counting instead of timing") DEFINE_bool(interrupt_at_exit, false,"insert an interrupt check at function exit") DEFINE_bool(weighted_back_edges, false,"weight back edges by jump distance for interrupt triggering") DEFINE_int(interrupt_budget, 5900,"execution budget before interrupt is triggered") DEFINE_int(type_info_threshold, 15,"percentage of ICs that must have type info to allow optimization") DEFINE_int(self_opt_count, 130,"call count before self-optimization") DEFINE_implication(experimental_profiler, watch_ic_patching) DEFINE_implication(experimental_profiler, self_optimization) DEFINE_implication(experimental_profiler, retry_self_opt) DEFINE_implication(experimental_profiler, count_based_interrupts) DEFINE_implication(experimental_profiler, interrupt_at_exit) DEFINE_implication(experimental_profiler, weighted_back_edges) DEFINE_bool(trace_opt_verbose, false,"extra verbose compilation tracing") DEFINE_implication(trace_opt_verbose, trace_opt) DEFINE_bool(debug_code, false,"generate extra code (assertions) for debugging") DEFINE_bool(code_comments, false,"emit comments in code disassembly") DEFINE_bool(enable_sse2, true,"enable use of SSE2 instructions if available") DEFINE_bool(enable_sse3, true,"enable use of SSE3 instructions if available") DEFINE_bool(enable_sse4_1, true,"enable use of SSE4.1 instructions if available") DEFINE_bool(enable_cmov, true,"enable use of CMOV instruction if available") DEFINE_bool(enable_rdtsc, true,"enable use of RDTSC instruction if available") DEFINE_bool(enable_sahf, true,"enable use of SAHF instruction if available (X64 only)") DEFINE_bool(enable_vfp3, true,"enable use of VFP3 instructions if available - this implies ""enabling ARMv7 instructions (ARM only)") DEFINE_bool(enable_armv7, true,"enable use of ARMv7 instructions if available (ARM only)") DEFINE_bool(enable_fpu, true,"enable use of MIPS FPU instructions if available (MIPS only)") DEFINE_string(expose_natives_as, NULL,"expose natives in global object") DEFINE_string(expose_debug_as, NULL,"expose debug in global object") DEFINE_bool(expose_gc, false,"expose gc extension") DEFINE_bool(expose_externalize_string, false,"expose externalize string extension") DEFINE_int(stack_trace_limit, 10,"number of stack frames to capture") DEFINE_bool(builtins_in_stack_traces, false,"show built-in functions in stack traces") DEFINE_bool(disable_native_files, false,"disable builtin natives files") DEFINE_bool(inline_new, true,"use fast inline allocation") DEFINE_bool(stack_trace_on_abort, true,"print a stack trace if an assertion failure occurs") DEFINE_bool(trace, false,"trace function calls") DEFINE_bool(mask_constants_with_cookie, true,"use random jit cookie to mask large constants") DEFINE_bool(lazy, true,"use lazy compilation") DEFINE_bool(trace_opt, false,"trace lazy optimization") DEFINE_bool(trace_opt_stats, false,"trace lazy optimization statistics") DEFINE_bool(opt, true,"use adaptive optimizations") DEFINE_bool(always_opt, false,"always try to optimize functions") DEFINE_bool(prepare_always_opt, false,"prepare for turning on always opt") DEFINE_bool(trace_deopt, false,"trace deoptimization") DEFINE_int(min_preparse_length, 1024,"minimum length for automatic enable preparsing") DEFINE_bool(always_full_compiler, false,"try to use the dedicated run-once backend for all code") DEFINE_bool(trace_bailout, false,"print reasons for falling back to using the classic V8 backend") DEFINE_bool(compilation_cache, true,"enable compilation cache") DEFINE_bool(cache_prototype_transitions, true,"cache prototype transitions") DEFINE_bool(trace_debug_json, false,"trace debugging JSON request/response") DEFINE_bool(debugger_auto_break, true,"automatically set the debug break flag when debugger commands are ""in the queue") DEFINE_bool(enable_liveedit, true,"enable liveedit experimental feature") DEFINE_bool(break_on_abort, true,"always cause a debug break before aborting") DEFINE_int(stack_size, kPointerSize *123,"default size of stack region v8 is allowed to use (in kBytes)") DEFINE_int(max_stack_trace_source_length, 300,"maximum length of function source code printed in a stack trace.") DEFINE_bool(always_inline_smi_code, false,"always inline smi code in non-opt code") DEFINE_int(max_new_space_size, 0,"max size of the new generation (in kBytes)") DEFINE_int(max_old_space_size, 0,"max size of the old generation (in Mbytes)") DEFINE_int(max_executable_size, 0,"max size of executable memory (in Mbytes)") DEFINE_bool(gc_global, false,"always perform global GCs") DEFINE_int(gc_interval,-1,"garbage collect after <n> allocations") DEFINE_bool(trace_gc, false,"print one trace line following each garbage collection") DEFINE_bool(trace_gc_nvp, false,"print one detailed trace line in name=value format ""after each garbage collection") DEFINE_bool(print_cumulative_gc_stat, false,"print cumulative GC statistics in name=value format on exit") DEFINE_bool(trace_gc_verbose, false,"print more details following each garbage collection") DEFINE_bool(trace_fragmentation, false,"report fragmentation for old pointer and data pages") DEFINE_bool(collect_maps, true,"garbage collect maps from which no objects can be reached") DEFINE_bool(flush_code, true,"flush code that we expect not to use again before full gc") DEFINE_bool(incremental_marking, true,"use incremental marking") DEFINE_bool(incremental_marking_steps, true,"do incremental marking steps") DEFINE_bool(trace_incremental_marking, false,"trace progress of the incremental marking") DEFINE_bool(use_idle_notification, true,"Use idle notification to reduce memory footprint.") DEFINE_bool(send_idle_notification, false,"Send idle notifcation between stress runs.") DEFINE_bool(use_ic, true,"use inline caching") DEFINE_bool(native_code_counters, false,"generate extra code for manipulating stats counters") DEFINE_bool(always_compact, false,"Perform compaction on every full GC") DEFINE_bool(lazy_sweeping, true,"Use lazy sweeping for old pointer and data spaces") DEFINE_bool(never_compact, false,"Never perform compaction on full GC - testing only") DEFINE_bool(compact_code_space, true,"Compact code space on full non-incremental collections") DEFINE_bool(cleanup_code_caches_at_gc, true,"Flush inline caches prior to mark compact collection and ""flush code caches in maps during mark compact cycle.") DEFINE_int(random_seed, 0,"Default seed for initializing random generator ""(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer, true,"allows verbose printing") DEFINE_bool(allow_natives_syntax, false,"allow natives syntax") DEFINE_bool(trace_sim, false,"Trace simulator execution") DEFINE_bool(check_icache, false,"Check icache flushes in ARM and MIPS simulator") DEFINE_int(stop_sim_at, 0,"Simulator stop after x number of instructions") DEFINE_int(sim_stack_alignment, 8,"Stack alingment in bytes in simulator (4 or 8, 8 is default)") DEFINE_bool(trace_exception, false,"print stack trace when throwing exceptions") DEFINE_bool(preallocate_message_memory, false,"preallocate some memory to build stack traces.") DEFINE_bool(randomize_hashes, true,"randomize hashes to avoid predictable hash collisions ""(with snapshots this option cannot override the baked-in seed)") DEFINE_int(hash_seed, 0,"Fixed seed to use to hash property keys (0 means random)""(with snapshots this option cannot override the baked-in seed)") DEFINE_bool(preemption, false,"activate a 100ms timer that switches between V8 threads") DEFINE_bool(regexp_optimization, true,"generate optimized regexp code") DEFINE_bool(testing_bool_flag, true,"testing_bool_flag") DEFINE_int(testing_int_flag, 13,"testing_int_flag") DEFINE_float(testing_float_flag, 2.5,"float-flag") DEFINE_string(testing_string_flag,"Hello, world!","string-flag") DEFINE_int(testing_prng_seed, 42,"Seed used for threading test randomness") DEFINE_string(testing_serialization_file,"/tmp/serdes","file in which to serialize heap") DEFINE_bool(help, false,"Print usage message, including flags, on console") DEFINE_bool(dump_counters, false,"Dump counters on exit") DEFINE_string(map_counters,"","Map counters to a file") DEFINE_args(js_arguments, JSARGUMENTS_INIT,"Pass all remaining arguments to the script. Alias for \"--\".") DEFINE_bool(debug_compile_events, true,"Enable debugger compile events") DEFINE_bool(debug_script_collected_events, true,"Enable debugger script collected events") DEFINE_bool(gdbjit, false,"enable GDBJIT interface (disables compacting GC)") DEFINE_bool(gdbjit_full, false,"enable GDBJIT interface for all code objects") DEFINE_bool(gdbjit_dump, false,"dump elf objects with debug info to disk") DEFINE_string(gdbjit_dump_filter,"","dump only objects containing this substring") DEFINE_bool(force_marking_deque_overflows, false,"force overflows of marking deque by reducing it's size ""to 64 words") DEFINE_bool(stress_compaction, false,"stress the GC compactor to flush out bugs (implies ""--force_marking_deque_overflows)")#define FLAG DEFINE_bool(enable_slow_asserts, false,"enable asserts that are slow to execute") DEFINE_bool(trace_codegen, false,"print name of functions for which code is generated") DEFINE_bool(print_source, false,"pretty print source code") DEFINE_bool(print_builtin_source, false,"pretty print source code for builtins") DEFINE_bool(print_ast, false,"print source AST") DEFINE_bool(print_builtin_ast, false,"print source AST for builtins") DEFINE_string(stop_at,"","function name where to insert a breakpoint") DEFINE_bool(print_builtin_scopes, false,"print scopes for builtins") DEFINE_bool(print_scopes, false,"print scopes") DEFINE_bool(trace_contexts, false,"trace contexts operations") DEFINE_bool(gc_greedy, false,"perform GC prior to some allocations") DEFINE_bool(gc_verbose, false,"print stuff during garbage collection") DEFINE_bool(heap_stats, false,"report heap statistics before and after GC") DEFINE_bool(code_stats, false,"report code statistics after GC") DEFINE_bool(verify_heap, false,"verify heap pointers before and after GC") DEFINE_bool(print_handles, false,"report handles after GC") DEFINE_bool(print_global_handles, false,"report global handles after GC") DEFINE_bool(trace_ic, false,"trace inline cache state transitions") DEFINE_bool(print_interfaces, false,"print interfaces") DEFINE_bool(print_interface_details, false,"print interface inference details") DEFINE_int(print_interface_depth, 5,"depth for printing interfaces") DEFINE_bool(trace_normalization, false,"prints when objects are turned into dictionaries.") DEFINE_bool(trace_lazy, false,"trace lazy compilation") DEFINE_bool(collect_heap_spill_statistics, false,"report heap spill statistics along with heap_stats ""(requires heap_stats)") DEFINE_bool(trace_isolates, false,"trace isolate state changes") DEFINE_bool(log_state_changes, false,"Log state changes.") DEFINE_bool(regexp_possessive_quantifier, false,"enable possessive quantifier syntax for testing") DEFINE_bool(trace_regexp_bytecodes, false,"trace regexp bytecode execution") DEFINE_bool(trace_regexp_assembler, false,"trace regexp macro assembler calls.")#define FLAG DEFINE_bool(log, false,"Minimal logging (no API, code, GC, suspect, or handles samples).") DEFINE_bool(log_all, false,"Log all events to the log file.") DEFINE_bool(log_runtime, false,"Activate runtime system %Log call.") DEFINE_bool(log_api, false,"Log API events to the log file.") DEFINE_bool(log_code, false,"Log code events to the log file without profiling.") DEFINE_bool(log_gc, false,"Log heap samples on garbage collection for the hp2ps tool.") DEFINE_bool(log_handles, false,"Log global handle events.") DEFINE_bool(log_snapshot_positions, false,"log positions of (de)serialized objects in the snapshot.") DEFINE_bool(log_suspect, false,"Log suspect operations.") DEFINE_bool(prof, false,"Log statistical profiling information (implies --log-code).") DEFINE_bool(prof_auto, true,"Used with --prof, starts profiling automatically") DEFINE_bool(prof_lazy, false,"Used with --prof, only does sampling and logging"" when profiler is active (implies --noprof_auto).") DEFINE_bool(prof_browser_mode, true,"Used with --prof, turns on browser-compatible mode for profiling.") DEFINE_bool(log_regexp, false,"Log regular expression execution.") DEFINE_bool(sliding_state_window, false,"Update sliding state window counters.") DEFINE_string(logfile,"v8.log","Specify the name of the log file.") DEFINE_bool(ll_prof, false,"Enable low-level linux profiler.")#define FLAG DEFINE_bool(trace_elements_transitions, false,"trace elements transitions") DEFINE_bool(print_code_stubs, false,"print code stubs") DEFINE_bool(test_secondary_stub_cache, false,"test secondary stub cache by disabling the primary one") DEFINE_bool(test_primary_stub_cache, false,"test primary stub cache by disabling the secondary one") DEFINE_bool(print_code, false,"print generated code") DEFINE_bool(print_opt_code, false,"print optimized code") DEFINE_bool(print_unopt_code, false,"print unoptimized code before ""printing optimized code based on it") DEFINE_bool(print_code_verbose, false,"print more information for code") DEFINE_bool(print_builtin_code, false,"print generated code for builtins")#47"/Users/thlorenz/dev/dx/v8-perf/build/v8/src/flags.cc"2 namespace{struct Flag{enum FlagType{TYPE_BOOL, TYPE_INT, TYPE_FLOAT, TYPE_STRING, TYPE_ARGS} name
Definition: flags.cc:1349
static MUST_USE_RESULT MaybeObject * ForceDeleteObjectProperty(Isolate *isolate, Handle< JSReceiver > object, Handle< Object > key)
Definition: runtime.cc:4675
static Handle< T > cast(Handle< S > that)
Definition: handles.h:81
bool MayNamedAccess(JSObject *receiver, Object *key, v8::AccessType type)
Definition: isolate.cc:801
bool IsAsciiRepresentation()
Definition: objects-inl.h:289
Vector< const char > ToAsciiVector()
Definition: objects.h:6918
static const int kEnumCacheBridgeLength
Definition: objects.h:2614
v8::HandleScope::Data HandleScopeData
Definition: apiutils.h:69
static bool enabled()
Definition: serialize.h:480
static MUST_USE_RESULT MaybeObject * SetObjectProperty(Isolate *isolate, Handle< Object > object, Handle< Object > key, Handle< Object > value, PropertyAttributes attr, StrictModeFlag strict_mode)
Definition: runtime.cc:4540
Handle< Object > SetAccessor(Handle< JSObject > obj, Handle< AccessorInfo > info)
Definition: handles.cc:342
void DeleteExtensions(internal::Object **prev_limit)
Definition: api.h:537
void SetPrototypeProperty(Handle< JSFunction > func, Handle< JSObject > value)
Definition: handles.cc:176
Context * global_context()
Definition: contexts.cc:58
static Address current_next_address()
Definition: handles.cc:121
Handle< FixedArray > UnionOfKeys(Handle< FixedArray > first, Handle< FixedArray > second)
Definition: handles.cc:140
void InitScriptLineEnds(Handle< Script > script)
Definition: handles.cc:394
#define ASSERT(condition)
Definition: checks.h:270
Handle< JSArray > GetKeysFor(Handle< JSReceiver > object, bool *threw)
Definition: handles.cc:693
static Script * cast(Object *obj)
#define CALL_HEAP_FUNCTION_VOID(ISOLATE, FUNCTION_CALL)
Definition: heap-inl.h:556
Handle< Object > GetPropertyWithInterceptor(Handle< JSObject > receiver, Handle< JSObject > holder, Handle< String > name, PropertyAttributes *attributes)
Definition: handles.cc:298
int GetScriptColumnNumber(Handle< Script > script, int code_pos)
Definition: handles.cc:504
Handle< Object > GetProperty(Handle< JSReceiver > obj, const char *name)
Definition: handles.cc:282
MUST_USE_RESULT MaybeObject * CopyJSObject(JSObject *source)
Definition: heap.cc:4144
Factory * factory()
Definition: isolate.h:977
PropertyAttributes
Handle< String > LookupAsciiSymbol(Vector< const char > str)
Definition: factory.cc:174
static Smi * cast(Object *object)
Handle< String > FlattenGetString(Handle< String > string)
Definition: handles.cc:216
Handle< Object > ForceDeleteProperty(Handle< JSObject > object, Handle< Object > key)
Definition: handles.cc:259
static Address current_limit_address()
Definition: handles.cc:127
Handle< String > SubString(Handle< String > str, int start, int end, PretenureFlag pretenure)
Definition: handles.cc:326
T ** location() const
Definition: handles.h:75
static uchar Length(uchar chr, int previous)
Definition: unicode-inl.h:123
#define UNREACHABLE()
Definition: checks.h:50
T * start() const
Definition: utils.h:389
Handle< Object > LookupSingleCharacterStringFromCode(uint32_t index)
Definition: handles.cc:318
void SetExpectedNofProperties(Handle< JSFunction > func, int nof)
Definition: handles.cc:157
static SlicedString * cast(Object *obj)
int Utf8LengthHelper(String *input, int from, int to, bool followed_by_surrogate, int max_recursion, bool *failure, bool *starts_with_surrogate)
Definition: handles.cc:825
Handle< Object > Create(Object *value)
#define CALL_HEAP_FUNCTION(ISOLATE, FUNCTION_CALL, TYPE)
Definition: heap-inl.h:549
Handle< ObjectHashSet > ObjectHashSetAdd(Handle< ObjectHashSet > table, Handle< Object > key)
Definition: handles.cc:778
Handle< Object > SetProperty(Handle< Object > object, Handle< Object > key, Handle< Object > value, PropertyAttributes attributes, StrictModeFlag strict_mode)
Definition: handles.cc:232
GlobalHandles * global_handles()
Definition: isolate.h:865
Handle< JSValue > GetScriptWrapper(Handle< Script > script)
Definition: handles.cc:366
Vector< const uc16 > ToUC16Vector()
Definition: objects.h:6924
Handle< FixedArray > NewFixedArray(int size, PretenureFlag pretenure=NOT_TENURED)
Definition: factory.cc:44
v8::ImplementationUtilities::HandleScopeData * handle_scope_data()
Definition: isolate.h:846
int GetScriptLineNumberSafe(Handle< Script > script, int code_pos)
Definition: handles.cc:517
Handle< FixedArray > GetKeysInFixedArrayFor(Handle< JSReceiver > object, KeyCollectionType type, bool *threw)
Definition: handles.cc:600
static Handle< Object > Call(Handle< Object > callable, Handle< Object > receiver, int argc, Handle< Object > argv[], bool *pending_exception, bool convert_receiver=false)
Definition: execution.cc:144
Vector< const char > CStrVector(const char *data)
Definition: utils.h:525
Handle< ObjectHashTable > PutIntoObjectHashTable(Handle< ObjectHashTable > table, Handle< Object > key, Handle< Object > value)
Definition: handles.cc:794
Handle< JSArray > NewJSArrayWithElements(Handle< FixedArrayBase > elements, ElementsKind elements_kind=TERMINAL_FAST_ELEMENTS_KIND, PretenureFlag pretenure=NOT_TENURED)
Definition: factory.cc:1019
Context * context()
Definition: isolate.h:518
bool IsString() const
Definition: v8.h:4313
List< internal::Object ** > * blocks()
Definition: api.h:447
FlatContent GetFlatContent()
Definition: objects.cc:6119
int GetScriptLineNumber(Handle< Script > script, int code_pos)
Definition: handles.cc:479
static MUST_USE_RESULT MaybeObject * FunctionSetPrototype(JSObject *object, Object *value, void *)
Definition: accessors.cc:476
v8::Handle< v8::Array > GetKeysForNamedInterceptor(Handle< JSReceiver > receiver, Handle< JSObject > object)
Definition: handles.cc:547
bool is_null() const
Definition: handles.h:87
V8EXPORT bool IsNumber() const
Definition: api.cc:2175
static Object * cast(Object *value)
Definition: objects.h:962
uint16_t uc16
Definition: globals.h:273
static JSValue * cast(Object *obj)
Definition: objects-inl.h:4327
static const unsigned kBytesSavedByCombiningSurrogates
Definition: unicode.h:171
Handle< JSGlobalProxy > ReinitializeJSGlobalProxy(Handle< JSFunction > constructor, Handle< JSGlobalProxy > global)
Definition: handles.cc:147
const int kHandleBlockSize
Definition: api.h:491
static MUST_USE_RESULT MaybeObject * GetObjectProperty(Isolate *isolate, Handle< Object > object, Handle< Object > key)
Definition: runtime.cc:4288
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
Definition: flags.cc:274
MUST_USE_RESULT MaybeObject * LookupSingleCharacterStringFromCode(uint16_t code)
Definition: heap.cc:3381
static MUST_USE_RESULT MaybeObject * ForceSetObjectProperty(Isolate *isolate, Handle< JSObject > object, Handle< Object > key, Handle< Object > value, PropertyAttributes attr)
Definition: runtime.cc:4622
static JSProxy * cast(Object *obj)
void IterateInstance(ObjectVisitor *v)
Definition: handles.cc:541
void USE(T)
Definition: globals.h:303
Counters * counters()
Definition: isolate.h:804
static FixedArray * cast(Object *obj)
static bool ReportApiFailure(const char *location, const char *message)
Definition: api.cc:219
bool IsEmpty() const
Definition: v8.h:208
Object * get(int index)
Definition: objects-inl.h:1675
static bool IsLeadSurrogate(int code)
Definition: unicode.h:120
Handle< Object > ForceSetProperty(Handle< JSObject > object, Handle< Object > key, Handle< Object > value, PropertyAttributes attributes)
Definition: handles.cc:246
Handle< ObjectHashSet > ObjectHashSetRemove(Handle< ObjectHashSet > table, Handle< Object > key)
Definition: handles.cc:786
void SetExpectedNofPropertiesFromEstimate(Handle< SharedFunctionInfo > shared, int estimate)
Definition: handles.cc:201
static bool IsTrailSurrogate(int code)
Definition: unicode.h:124
void MakeWeak(Object **location, void *parameter, WeakReferenceCallback callback)
Handle< Object > SetPrototype(Handle< JSFunction > function, Handle< Object > prototype)
Definition: handles.cc:221
Handle< FixedArray > GetEnumPropertyKeys(Handle< JSObject > object, bool cache_result)
Definition: handles.cc:702
static ConsString * cast(Object *obj)
Handle< Array >(* IndexedPropertyEnumerator)(const AccessorInfo &info)
Definition: v8.h:2095
#define ARRAY_SIZE(a)
Definition: globals.h:295
static JSObject * cast(Object *obj)
FlagType type() const
Definition: flags.cc:1358
const Address kHandleZapValue
Definition: v8globals.h:90
static const int kNoPreviousCharacter
Definition: unicode.h:132
static void DeleteExtensions(Isolate *isolate)
Definition: handles.cc:99
static v8::internal::Handle< v8::internal::TemplateInfo > OpenHandle(const Template *that)
Handle< JSObject > Copy(Handle< JSObject > obj)
Definition: handles.cc:335
static JSFunction * cast(Object *obj)