OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
255 } | 255 } |
256 } | 256 } |
257 | 257 |
258 | 258 |
259 bool ObjectLiteral::IsBoilerplateProperty(ObjectLiteral::Property* property) { | 259 bool ObjectLiteral::IsBoilerplateProperty(ObjectLiteral::Property* property) { |
260 return property != NULL && | 260 return property != NULL && |
261 property->kind() != ObjectLiteral::Property::PROTOTYPE; | 261 property->kind() != ObjectLiteral::Property::PROTOTYPE; |
262 } | 262 } |
263 | 263 |
264 | 264 |
265 void ObjectLiteral::BuildConstantProperties(Isolate* isolate, int* depth) { | 265 void ObjectLiteral::BuildConstantProperties(Isolate* isolate) { |
266 if (!constant_properties_.is_null()) return; | 266 if (!constant_properties_.is_null()) return; |
267 | 267 |
268 // Allocate a fixed array to hold all the constant properties. | 268 // Allocate a fixed array to hold all the constant properties. |
269 Handle<FixedArray> constant_properties = isolate->factory()->NewFixedArray( | 269 Handle<FixedArray> constant_properties = isolate->factory()->NewFixedArray( |
270 boilerplate_properties_ * 2, TENURED); | 270 boilerplate_properties_ * 2, TENURED); |
271 | 271 |
272 int position = 0; | 272 int position = 0; |
273 // Accumulate the value in local variables and store it at the end. | 273 // Accumulate the value in local variables and store it at the end. |
274 bool is_simple = true; | 274 bool is_simple = true; |
275 int depth_acc = 1; | 275 int depth_acc = 1; |
276 uint32_t max_element_index = 0; | 276 uint32_t max_element_index = 0; |
277 uint32_t elements = 0; | 277 uint32_t elements = 0; |
278 for (int i = 0; i < properties()->length(); i++) { | 278 for (int i = 0; i < properties()->length(); i++) { |
279 ObjectLiteral::Property* property = properties()->at(i); | 279 ObjectLiteral::Property* property = properties()->at(i); |
280 if (!IsBoilerplateProperty(property)) { | 280 if (!IsBoilerplateProperty(property)) { |
281 is_simple = false; | 281 is_simple = false; |
282 continue; | 282 continue; |
283 } | 283 } |
284 MaterializedLiteral* m_literal = property->value()->AsMaterializedLiteral(); | 284 MaterializedLiteral* m_literal = property->value()->AsMaterializedLiteral(); |
285 if (m_literal != NULL) { | 285 if (m_literal != NULL) { |
286 int inner_depth = 1; | 286 m_literal->BuildConstants(isolate); |
287 m_literal->BuildConstants(isolate, &inner_depth); | 287 if (m_literal->depth() >= depth_acc) depth_acc = m_literal->depth() + 1; |
288 if (inner_depth >= depth_acc) depth_acc = inner_depth + 1; | |
289 } | 288 } |
290 | 289 |
291 // Add CONSTANT and COMPUTED properties to boilerplate. Use undefined | 290 // Add CONSTANT and COMPUTED properties to boilerplate. Use undefined |
292 // value for COMPUTED properties, the real value is filled in at | 291 // value for COMPUTED properties, the real value is filled in at |
293 // runtime. The enumeration order is maintained. | 292 // runtime. The enumeration order is maintained. |
294 Handle<Object> key = property->key()->value(); | 293 Handle<Object> key = property->key()->value(); |
295 Handle<Object> value = GetBoilerplateValue(property->value(), isolate); | 294 Handle<Object> value = GetBoilerplateValue(property->value(), isolate); |
296 | 295 |
297 // Ensure objects that may, at any point in time, contain fields with double | 296 // Ensure objects that may, at any point in time, contain fields with double |
298 // representation are always treated as nested objects. This is true for | 297 // representation are always treated as nested objects. This is true for |
(...skipping 28 matching lines...) Expand all Loading... |
327 | 326 |
328 // Add name, value pair to the fixed array. | 327 // Add name, value pair to the fixed array. |
329 constant_properties->set(position++, *key); | 328 constant_properties->set(position++, *key); |
330 constant_properties->set(position++, *value); | 329 constant_properties->set(position++, *value); |
331 } | 330 } |
332 | 331 |
333 constant_properties_ = constant_properties; | 332 constant_properties_ = constant_properties; |
334 fast_elements_ = | 333 fast_elements_ = |
335 (max_element_index <= 32) || ((2 * elements) >= max_element_index); | 334 (max_element_index <= 32) || ((2 * elements) >= max_element_index); |
336 set_is_simple(is_simple); | 335 set_is_simple(is_simple); |
337 if (depth != NULL) *depth = depth_acc; | 336 set_depth(depth_acc); |
338 } | 337 } |
339 | 338 |
340 | 339 |
341 void ArrayLiteral::BuildConstantElements(Isolate* isolate, int* depth) { | 340 void ArrayLiteral::BuildConstantElements(Isolate* isolate) { |
342 if (!constant_elements_.is_null()) return; | 341 if (!constant_elements_.is_null()) return; |
343 | 342 |
344 // Allocate a fixed array to hold all the object literals. | 343 // Allocate a fixed array to hold all the object literals. |
345 Handle<JSArray> array = | 344 Handle<JSArray> array = |
346 isolate->factory()->NewJSArray(0, FAST_HOLEY_SMI_ELEMENTS); | 345 isolate->factory()->NewJSArray(0, FAST_HOLEY_SMI_ELEMENTS); |
347 isolate->factory()->SetElementsCapacityAndLength( | 346 isolate->factory()->SetElementsCapacityAndLength( |
348 array, values()->length(), values()->length()); | 347 array, values()->length(), values()->length()); |
349 | 348 |
350 // Fill in the literals. | 349 // Fill in the literals. |
351 bool is_simple = true; | 350 bool is_simple = true; |
352 int depth_acc = 1; | 351 int depth_acc = 1; |
353 bool is_holey = false; | 352 bool is_holey = false; |
354 for (int i = 0, n = values()->length(); i < n; i++) { | 353 for (int i = 0, n = values()->length(); i < n; i++) { |
355 Expression* element = values()->at(i); | 354 Expression* element = values()->at(i); |
356 MaterializedLiteral* m_literal = element->AsMaterializedLiteral(); | 355 MaterializedLiteral* m_literal = element->AsMaterializedLiteral(); |
357 if (m_literal != NULL) { | 356 if (m_literal != NULL) { |
358 int inner_depth = 1; | 357 m_literal->BuildConstants(isolate); |
359 m_literal->BuildConstants(isolate, &inner_depth); | 358 if (m_literal->depth() + 1 > depth_acc) { |
360 if (inner_depth + 1 > depth_acc) depth_acc = inner_depth + 1; | 359 depth_acc = m_literal->depth() + 1; |
| 360 } |
361 } | 361 } |
362 Handle<Object> boilerplate_value = GetBoilerplateValue(element, isolate); | 362 Handle<Object> boilerplate_value = GetBoilerplateValue(element, isolate); |
363 if (boilerplate_value->IsTheHole()) { | 363 if (boilerplate_value->IsTheHole()) { |
364 is_holey = true; | 364 is_holey = true; |
365 } else if (boilerplate_value->IsUninitialized()) { | 365 } else if (boilerplate_value->IsUninitialized()) { |
366 is_simple = false; | 366 is_simple = false; |
367 JSObject::SetOwnElement( | 367 JSObject::SetOwnElement( |
368 array, i, handle(Smi::FromInt(0), isolate), kNonStrictMode); | 368 array, i, handle(Smi::FromInt(0), isolate), kNonStrictMode); |
369 } else { | 369 } else { |
370 JSObject::SetOwnElement(array, i, boilerplate_value, kNonStrictMode); | 370 JSObject::SetOwnElement(array, i, boilerplate_value, kNonStrictMode); |
(...skipping 14 matching lines...) Expand all Loading... |
385 Handle<FixedArray> literals = isolate->factory()->NewFixedArray(2, TENURED); | 385 Handle<FixedArray> literals = isolate->factory()->NewFixedArray(2, TENURED); |
386 | 386 |
387 ElementsKind kind = array->GetElementsKind(); | 387 ElementsKind kind = array->GetElementsKind(); |
388 kind = is_holey ? GetHoleyElementsKind(kind) : GetPackedElementsKind(kind); | 388 kind = is_holey ? GetHoleyElementsKind(kind) : GetPackedElementsKind(kind); |
389 | 389 |
390 literals->set(0, Smi::FromInt(kind)); | 390 literals->set(0, Smi::FromInt(kind)); |
391 literals->set(1, *element_values); | 391 literals->set(1, *element_values); |
392 | 392 |
393 constant_elements_ = literals; | 393 constant_elements_ = literals; |
394 set_is_simple(is_simple); | 394 set_is_simple(is_simple); |
395 if (depth != NULL) *depth = depth_acc; | 395 set_depth(depth_acc); |
396 } | 396 } |
397 | 397 |
398 | 398 |
399 Handle<Object> MaterializedLiteral::GetBoilerplateValue(Expression* expression, | 399 Handle<Object> MaterializedLiteral::GetBoilerplateValue(Expression* expression, |
400 Isolate* isolate) { | 400 Isolate* isolate) { |
401 if (expression->AsLiteral() != NULL) { | 401 if (expression->AsLiteral() != NULL) { |
402 return expression->AsLiteral()->value(); | 402 return expression->AsLiteral()->value(); |
403 } | 403 } |
404 if (CompileTimeValue::IsCompileTimeValue(expression)) { | 404 if (CompileTimeValue::IsCompileTimeValue(expression)) { |
405 return CompileTimeValue::GetValue(isolate, expression); | 405 return CompileTimeValue::GetValue(isolate, expression); |
406 } | 406 } |
407 return isolate->factory()->uninitialized_value(); | 407 return isolate->factory()->uninitialized_value(); |
408 } | 408 } |
409 | 409 |
410 | 410 |
411 void MaterializedLiteral::BuildConstants(Isolate* isolate, int* depth) { | 411 void MaterializedLiteral::BuildConstants(Isolate* isolate) { |
412 if (IsArrayLiteral()) { | 412 if (IsArrayLiteral()) { |
413 return AsArrayLiteral()->BuildConstantElements(isolate, depth); | 413 return AsArrayLiteral()->BuildConstantElements(isolate); |
414 } | 414 } |
415 if (IsObjectLiteral()) { | 415 if (IsObjectLiteral()) { |
416 return AsObjectLiteral()->BuildConstantProperties(isolate, depth); | 416 return AsObjectLiteral()->BuildConstantProperties(isolate); |
417 } | 417 } |
418 ASSERT(IsRegExpLiteral()); | 418 ASSERT(IsRegExpLiteral()); |
| 419 ASSERT(depth() >= 1); // Depth should be initialized. |
419 } | 420 } |
420 | 421 |
421 | 422 |
422 void TargetCollector::AddTarget(Label* target, Zone* zone) { | 423 void TargetCollector::AddTarget(Label* target, Zone* zone) { |
423 // Add the label to the collector, but discard duplicates. | 424 // Add the label to the collector, but discard duplicates. |
424 int length = targets_.length(); | 425 int length = targets_.length(); |
425 for (int i = 0; i < length; i++) { | 426 for (int i = 0; i < length; i++) { |
426 if (targets_[i] == target) return; | 427 if (targets_[i] == target) return; |
427 } | 428 } |
428 targets_.Add(target, zone); | 429 targets_.Add(target, zone); |
(...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1330 OS::SNPrintF(buffer, "%d", Smi::cast(*value_)->value()); | 1331 OS::SNPrintF(buffer, "%d", Smi::cast(*value_)->value()); |
1331 str = arr; | 1332 str = arr; |
1332 } else { | 1333 } else { |
1333 str = DoubleToCString(value_->Number(), buffer); | 1334 str = DoubleToCString(value_->Number(), buffer); |
1334 } | 1335 } |
1335 return isolate_->factory()->NewStringFromAscii(CStrVector(str)); | 1336 return isolate_->factory()->NewStringFromAscii(CStrVector(str)); |
1336 } | 1337 } |
1337 | 1338 |
1338 | 1339 |
1339 } } // namespace v8::internal | 1340 } } // namespace v8::internal |
OLD | NEW |