Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 3298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3309 HValue* context = environment()->LookupContext(); | 3309 HValue* context = environment()->LookupContext(); |
| 3310 | 3310 |
| 3311 HRegExpLiteral* instr = new(zone()) HRegExpLiteral(context, | 3311 HRegExpLiteral* instr = new(zone()) HRegExpLiteral(context, |
| 3312 expr->pattern(), | 3312 expr->pattern(), |
| 3313 expr->flags(), | 3313 expr->flags(), |
| 3314 expr->literal_index()); | 3314 expr->literal_index()); |
| 3315 return ast_context()->ReturnInstruction(instr, expr->id()); | 3315 return ast_context()->ReturnInstruction(instr, expr->id()); |
| 3316 } | 3316 } |
| 3317 | 3317 |
| 3318 | 3318 |
| 3319 // Determines whether the given object literal boilerplate satisfies all | |
| 3320 // limits to be considered for fast deep-copying and computes the total | |
| 3321 // size of all objects that are part of the graph. | |
| 3322 static bool IsFastObjectLiteral(Handle<JSObject> boilerplate, | |
| 3323 int max_depth, | |
| 3324 int* max_properties, | |
| 3325 int* total_size) { | |
| 3326 if (max_depth <= 0) return false; | |
| 3327 | |
| 3328 FixedArrayBase* elements = boilerplate->elements(); | |
| 3329 if (elements->length() > 0 && | |
| 3330 elements->map() != HEAP->fixed_cow_array_map()) { | |
| 3331 return false; | |
| 3332 } | |
| 3333 | |
| 3334 FixedArray* properties = boilerplate->properties(); | |
| 3335 if (properties->length() > 0) { | |
| 3336 return false; | |
| 3337 } else { | |
| 3338 int nof = boilerplate->map()->inobject_properties(); | |
| 3339 for (int i = 0; i < nof; i++) { | |
| 3340 if ((*max_properties)-- <= 0) return false; | |
| 3341 Handle<Object> value(boilerplate->InObjectPropertyAt(i)); | |
| 3342 if (value->IsJSObject()) { | |
| 3343 Handle<JSObject> value_object = Handle<JSObject>::cast(value); | |
| 3344 if (!IsFastObjectLiteral(value_object, | |
| 3345 max_depth - 1, | |
| 3346 max_properties, | |
| 3347 total_size)) { | |
| 3348 return false; | |
| 3349 } | |
| 3350 } | |
| 3351 } | |
| 3352 } | |
| 3353 | |
| 3354 *total_size += boilerplate->map()->instance_size(); | |
| 3355 return true; | |
| 3356 } | |
| 3357 | |
| 3358 | |
| 3319 void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { | 3359 void HGraphBuilder::VisitObjectLiteral(ObjectLiteral* expr) { |
| 3320 ASSERT(!HasStackOverflow()); | 3360 ASSERT(!HasStackOverflow()); |
| 3321 ASSERT(current_block() != NULL); | 3361 ASSERT(current_block() != NULL); |
| 3322 ASSERT(current_block()->HasPredecessor()); | 3362 ASSERT(current_block()->HasPredecessor()); |
| 3363 Handle<JSFunction> closure = info()->closure(); | |
|
fschneider
2011/11/22 17:26:16
You probably should write:
Handle<JSFunction> clo
Michael Starzinger
2011/11/23 10:55:32
Done.
| |
| 3323 HValue* context = environment()->LookupContext(); | 3364 HValue* context = environment()->LookupContext(); |
| 3324 HObjectLiteral* literal = | 3365 HInstruction* literal; |
| 3325 new(zone()) HObjectLiteral(context, | 3366 |
| 3326 expr->constant_properties(), | 3367 // Check whether to use fast or slow deep-copying for boilerplate. |
| 3327 expr->fast_elements(), | 3368 int total_size = 0; |
| 3328 expr->literal_index(), | 3369 int max_properties = HObjectLiteralFast::kMaxObjectLiteralProperties; |
| 3329 expr->depth(), | 3370 Handle<Object> boilerplate(closure->literals()->get(expr->literal_index())); |
| 3330 expr->has_function()); | 3371 if (boilerplate->IsJSObject() && |
| 3372 IsFastObjectLiteral(Handle<JSObject>::cast(boilerplate), | |
| 3373 HObjectLiteralFast::kMaxObjectLiteralDepth, | |
| 3374 &max_properties, | |
| 3375 &total_size)) { | |
| 3376 Handle<JSObject> boilerplate_object = Handle<JSObject>::cast(boilerplate); | |
| 3377 literal = new(zone()) HObjectLiteralFast(context, | |
| 3378 boilerplate_object, | |
| 3379 total_size, | |
| 3380 expr->literal_index(), | |
| 3381 expr->depth()); | |
| 3382 } else { | |
| 3383 literal = new(zone()) HObjectLiteralGeneric(context, | |
| 3384 expr->constant_properties(), | |
| 3385 expr->fast_elements(), | |
| 3386 expr->literal_index(), | |
| 3387 expr->depth(), | |
| 3388 expr->has_function()); | |
| 3389 } | |
| 3390 | |
| 3331 // The object is expected in the bailout environment during computation | 3391 // The object is expected in the bailout environment during computation |
| 3332 // of the property values and is the value of the entire expression. | 3392 // of the property values and is the value of the entire expression. |
| 3333 PushAndAdd(literal); | 3393 PushAndAdd(literal); |
| 3334 | 3394 |
| 3335 expr->CalculateEmitStore(); | 3395 expr->CalculateEmitStore(); |
| 3336 | 3396 |
| 3337 for (int i = 0; i < expr->properties()->length(); i++) { | 3397 for (int i = 0; i < expr->properties()->length(); i++) { |
| 3338 ObjectLiteral::Property* property = expr->properties()->at(i); | 3398 ObjectLiteral::Property* property = expr->properties()->at(i); |
| 3339 if (property->IsCompileTimeValue()) continue; | 3399 if (property->IsCompileTimeValue()) continue; |
| 3340 | 3400 |
| (...skipping 3811 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7152 } | 7212 } |
| 7153 } | 7213 } |
| 7154 | 7214 |
| 7155 #ifdef DEBUG | 7215 #ifdef DEBUG |
| 7156 if (graph_ != NULL) graph_->Verify(false); // No full verify. | 7216 if (graph_ != NULL) graph_->Verify(false); // No full verify. |
| 7157 if (allocator_ != NULL) allocator_->Verify(); | 7217 if (allocator_ != NULL) allocator_->Verify(); |
| 7158 #endif | 7218 #endif |
| 7159 } | 7219 } |
| 7160 | 7220 |
| 7161 } } // namespace v8::internal | 7221 } } // namespace v8::internal |
| OLD | NEW |