| Index: src/hydrogen.cc
 | 
| ===================================================================
 | 
| --- src/hydrogen.cc	(revision 10404)
 | 
| +++ src/hydrogen.cc	(working copy)
 | 
| @@ -1,4 +1,4 @@
 | 
| -// Copyright 2011 the V8 project authors. All rights reserved.
 | 
| +// Copyright 2012 the V8 project authors. All rights reserved.
 | 
|  // Redistribution and use in source and binary forms, with or without
 | 
|  // modification, are permitted provided that the following conditions are
 | 
|  // met:
 | 
| @@ -628,7 +628,11 @@
 | 
|  Handle<Code> HGraph::Compile(CompilationInfo* info) {
 | 
|    int values = GetMaximumValueID();
 | 
|    if (values > LAllocator::max_initial_value_ids()) {
 | 
| -    if (FLAG_trace_bailout) PrintF("Function is too big\n");
 | 
| +    if (FLAG_trace_bailout) {
 | 
| +      SmartArrayPointer<char> name(
 | 
| +          info->shared_info()->DebugName()->ToCString());
 | 
| +      PrintF("Function @\"%s\" is too big.\n", *name);
 | 
| +    }
 | 
|      return Handle<Code>::null();
 | 
|    }
 | 
|  
 | 
| @@ -2301,7 +2305,7 @@
 | 
|        Bailout("function with illegal redeclaration");
 | 
|        return NULL;
 | 
|      }
 | 
| -    SetupScope(scope);
 | 
| +    SetUpScope(scope);
 | 
|  
 | 
|      // Add an edge to the body entry.  This is warty: the graph's start
 | 
|      // environment will be used by the Lithium translation as the initial
 | 
| @@ -2465,7 +2469,7 @@
 | 
|  }
 | 
|  
 | 
|  
 | 
| -void HGraphBuilder::SetupScope(Scope* scope) {
 | 
| +void HGraphBuilder::SetUpScope(Scope* scope) {
 | 
|    HConstant* undefined_constant = new(zone()) HConstant(
 | 
|        isolate()->factory()->undefined_value(), Representation::Tagged());
 | 
|    AddInstruction(undefined_constant);
 | 
| @@ -3572,7 +3576,8 @@
 | 
|                                                    bool smi_and_map_check) {
 | 
|    if (smi_and_map_check) {
 | 
|      AddInstruction(new(zone()) HCheckNonSmi(object));
 | 
| -    AddInstruction(new(zone()) HCheckMap(object, type));
 | 
| +    AddInstruction(new(zone()) HCheckMap(object, type, NULL,
 | 
| +                                         ALLOW_ELEMENT_TRANSITION_MAPS));
 | 
|    }
 | 
|  
 | 
|    int index = ComputeStoredFieldIndex(type, name, lookup);
 | 
| @@ -4117,7 +4122,8 @@
 | 
|                                                      bool smi_and_map_check) {
 | 
|    if (smi_and_map_check) {
 | 
|      AddInstruction(new(zone()) HCheckNonSmi(object));
 | 
| -    AddInstruction(new(zone()) HCheckMap(object, type));
 | 
| +    AddInstruction(new(zone()) HCheckMap(object, type, NULL,
 | 
| +                                         ALLOW_ELEMENT_TRANSITION_MAPS));
 | 
|    }
 | 
|  
 | 
|    int index = lookup->GetLocalFieldIndexFromMap(*type);
 | 
| @@ -4157,7 +4163,8 @@
 | 
|                                 true);
 | 
|    } else if (lookup.IsProperty() && lookup.type() == CONSTANT_FUNCTION) {
 | 
|      AddInstruction(new(zone()) HCheckNonSmi(obj));
 | 
| -    AddInstruction(new(zone()) HCheckMap(obj, map));
 | 
| +    AddInstruction(new(zone()) HCheckMap(obj, map, NULL,
 | 
| +                                         ALLOW_ELEMENT_TRANSITION_MAPS));
 | 
|      Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map));
 | 
|      return new(zone()) HConstant(function, Representation::Tagged());
 | 
|    } else {
 | 
| @@ -4652,7 +4659,8 @@
 | 
|    // its prototypes.
 | 
|    if (smi_and_map_check) {
 | 
|      AddInstruction(new(zone()) HCheckNonSmi(receiver));
 | 
| -    AddInstruction(new(zone()) HCheckMap(receiver, receiver_map));
 | 
| +    AddInstruction(new(zone()) HCheckMap(receiver, receiver_map, NULL,
 | 
| +                                         ALLOW_ELEMENT_TRANSITION_MAPS));
 | 
|    }
 | 
|    if (!expr->holder().is_null()) {
 | 
|      AddInstruction(new(zone()) HCheckPrototypeMaps(
 | 
| @@ -5124,6 +5132,69 @@
 | 
|          return true;
 | 
|        }
 | 
|        break;
 | 
| +    case kMathRandom:
 | 
| +      if (argument_count == 1 && check_type == RECEIVER_MAP_CHECK) {
 | 
| +        AddCheckConstantFunction(expr, receiver, receiver_map, true);
 | 
| +        Drop(1);
 | 
| +        HValue* context = environment()->LookupContext();
 | 
| +        HGlobalObject* global_object = new(zone()) HGlobalObject(context);
 | 
| +        AddInstruction(global_object);
 | 
| +        HRandom* result = new(zone()) HRandom(global_object);
 | 
| +        ast_context()->ReturnInstruction(result, expr->id());
 | 
| +        return true;
 | 
| +      }
 | 
| +      break;
 | 
| +    case kMathMax:
 | 
| +    case kMathMin:
 | 
| +      if (argument_count == 3 && check_type == RECEIVER_MAP_CHECK) {
 | 
| +        AddCheckConstantFunction(expr, receiver, receiver_map, true);
 | 
| +        HValue* right = Pop();
 | 
| +        HValue* left = Pop();
 | 
| +        // Do not inline if the return representation is not certain.
 | 
| +        if (!left->representation().Equals(right->representation())) {
 | 
| +          Push(left);
 | 
| +          Push(right);
 | 
| +          return false;
 | 
| +        }
 | 
| +
 | 
| +        Pop();  // Pop receiver.
 | 
| +        Token::Value op = (id == kMathMin) ? Token::LT : Token::GT;
 | 
| +        HCompareIDAndBranch* compare = NULL;
 | 
| +
 | 
| +        if (left->representation().IsTagged()) {
 | 
| +          HChange* left_cvt =
 | 
| +              new(zone()) HChange(left, Representation::Double(), false, true);
 | 
| +          left_cvt->SetFlag(HValue::kBailoutOnMinusZero);
 | 
| +          AddInstruction(left_cvt);
 | 
| +          HChange* right_cvt =
 | 
| +              new(zone()) HChange(right, Representation::Double(), false, true);
 | 
| +          right_cvt->SetFlag(HValue::kBailoutOnMinusZero);
 | 
| +          AddInstruction(right_cvt);
 | 
| +          compare = new(zone()) HCompareIDAndBranch(left_cvt, right_cvt, op);
 | 
| +          compare->SetInputRepresentation(Representation::Double());
 | 
| +        } else {
 | 
| +          compare = new(zone()) HCompareIDAndBranch(left, right, op);
 | 
| +          compare->SetInputRepresentation(left->representation());
 | 
| +        }
 | 
| +
 | 
| +        HBasicBlock* return_left = graph()->CreateBasicBlock();
 | 
| +        HBasicBlock* return_right = graph()->CreateBasicBlock();
 | 
| +
 | 
| +        compare->SetSuccessorAt(0, return_left);
 | 
| +        compare->SetSuccessorAt(1, return_right);
 | 
| +        current_block()->Finish(compare);
 | 
| +
 | 
| +        set_current_block(return_left);
 | 
| +        Push(left);
 | 
| +        set_current_block(return_right);
 | 
| +        Push(right);
 | 
| +
 | 
| +        HBasicBlock* join = CreateJoin(return_left, return_right, expr->id());
 | 
| +        set_current_block(join);
 | 
| +        ast_context()->ReturnValue(Pop());
 | 
| +        return true;
 | 
| +      }
 | 
| +      break;
 | 
|      default:
 | 
|        // Not yet supported for inlining.
 | 
|        break;
 | 
| @@ -6195,9 +6266,11 @@
 | 
|          Handle<Map> map = oracle()->GetCompareMap(expr);
 | 
|          if (!map.is_null()) {
 | 
|            AddInstruction(new(zone()) HCheckNonSmi(left));
 | 
| -          AddInstruction(new(zone()) HCheckMap(left, map));
 | 
| +          AddInstruction(new(zone()) HCheckMap(left, map, NULL,
 | 
| +                                               ALLOW_ELEMENT_TRANSITION_MAPS));
 | 
|            AddInstruction(new(zone()) HCheckNonSmi(right));
 | 
| -          AddInstruction(new(zone()) HCheckMap(right, map));
 | 
| +          AddInstruction(new(zone()) HCheckMap(right, map, NULL,
 | 
| +                                               ALLOW_ELEMENT_TRANSITION_MAPS));
 | 
|            HCompareObjectEqAndBranch* result =
 | 
|                new(zone()) HCompareObjectEqAndBranch(left, right);
 | 
|            result->set_position(expr->position());
 | 
| @@ -6569,7 +6642,11 @@
 | 
|  
 | 
|  // Fast support for Math.random().
 | 
|  void HGraphBuilder::GenerateRandomHeapNumber(CallRuntime* call) {
 | 
| -  return Bailout("inlined runtime function: RandomHeapNumber");
 | 
| +  HValue* context = environment()->LookupContext();
 | 
| +  HGlobalObject* global_object = new(zone()) HGlobalObject(context);
 | 
| +  AddInstruction(global_object);
 | 
| +  HRandom* result = new(zone()) HRandom(global_object);
 | 
| +  return ast_context()->ReturnInstruction(result, call->id());
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |