| Index: src/bootstrapper.cc
 | 
| ===================================================================
 | 
| --- src/bootstrapper.cc	(revision 9531)
 | 
| +++ src/bootstrapper.cc	(working copy)
 | 
| @@ -34,6 +34,7 @@
 | 
|  #include "debug.h"
 | 
|  #include "execution.h"
 | 
|  #include "global-handles.h"
 | 
| +#include "isolate-inl.h"
 | 
|  #include "macro-assembler.h"
 | 
|  #include "natives.h"
 | 
|  #include "objects-visiting.h"
 | 
| @@ -995,6 +996,26 @@
 | 
|          initial_map->instance_size() + 5 * kPointerSize);
 | 
|      initial_map->set_instance_descriptors(*descriptors);
 | 
|      initial_map->set_visitor_id(StaticVisitorBase::GetVisitorId(*initial_map));
 | 
| +
 | 
| +    // RegExp prototype object is itself a RegExp.
 | 
| +    Handle<Map> proto_map = factory->CopyMapDropTransitions(initial_map);
 | 
| +    proto_map->set_prototype(global_context()->initial_object_prototype());
 | 
| +    Handle<JSObject> proto = factory->NewJSObjectFromMap(proto_map);
 | 
| +    proto->InObjectPropertyAtPut(JSRegExp::kSourceFieldIndex,
 | 
| +                                 heap->empty_string());
 | 
| +    proto->InObjectPropertyAtPut(JSRegExp::kGlobalFieldIndex,
 | 
| +                                 heap->false_value());
 | 
| +    proto->InObjectPropertyAtPut(JSRegExp::kIgnoreCaseFieldIndex,
 | 
| +                                 heap->false_value());
 | 
| +    proto->InObjectPropertyAtPut(JSRegExp::kMultilineFieldIndex,
 | 
| +                                 heap->false_value());
 | 
| +    proto->InObjectPropertyAtPut(JSRegExp::kLastIndexFieldIndex,
 | 
| +                                 Smi::FromInt(0),
 | 
| +                                 SKIP_WRITE_BARRIER);  // It's a Smi.
 | 
| +    initial_map->set_prototype(*proto);
 | 
| +    factory->SetRegExpIrregexpData(Handle<JSRegExp>::cast(proto),
 | 
| +                                   JSRegExp::IRREGEXP, factory->empty_string(),
 | 
| +                                   JSRegExp::Flags(0), 0);
 | 
|    }
 | 
|  
 | 
|    {  // -- J S O N
 | 
| @@ -1076,6 +1097,11 @@
 | 
|      elements->set(0, *array);
 | 
|      array = factory->NewFixedArray(0);
 | 
|      elements->set(1, *array);
 | 
| +    Handle<Map> non_strict_arguments_elements_map =
 | 
| +        factory->GetElementsTransitionMap(result,
 | 
| +                                          NON_STRICT_ARGUMENTS_ELEMENTS);
 | 
| +    result->set_map(*non_strict_arguments_elements_map);
 | 
| +    ASSERT(result->HasNonStrictArgumentsElements());
 | 
|      result->set_elements(*elements);
 | 
|      global_context()->set_aliased_arguments_boilerplate(*result);
 | 
|    }
 | 
| @@ -1327,6 +1353,8 @@
 | 
|                   configure_instance_fun);
 | 
|    INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun);
 | 
|    INSTALL_NATIVE(JSObject, "functionCache", function_cache);
 | 
| +  INSTALL_NATIVE(JSFunction, "ToCompletePropertyDescriptor",
 | 
| +                 to_complete_property_descriptor);
 | 
|  }
 | 
|  
 | 
|  void Genesis::InstallExperimentalNativeFunctions() {
 | 
| @@ -1555,6 +1583,18 @@
 | 
|          isolate()->builtins()->builtin(Builtins::kArrayConstructCode));
 | 
|      array_function->shared()->DontAdaptArguments();
 | 
|  
 | 
| +    // InternalArrays should not use Smi-Only array optimizations. There are too
 | 
| +    // many places in the C++ runtime code (e.g. RegEx) that assume that
 | 
| +    // elements in InternalArrays can be set to non-Smi values without going
 | 
| +    // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT
 | 
| +    // transition easy to trap. Moreover, they rarely are smi-only.
 | 
| +    MaybeObject* maybe_map =
 | 
| +        array_function->initial_map()->CopyDropTransitions();
 | 
| +    Map* new_map;
 | 
| +    if (!maybe_map->To<Map>(&new_map)) return maybe_map;
 | 
| +    new_map->set_elements_kind(FAST_ELEMENTS);
 | 
| +    array_function->set_initial_map(new_map);
 | 
| +
 | 
|      // Make "length" magic on instances.
 | 
|      Handle<DescriptorArray> array_descriptors =
 | 
|          factory()->CopyAppendForeignDescriptor(
 | 
| @@ -1938,14 +1978,15 @@
 | 
|      if (!InstallExtension(extension->dependencies()[i])) return false;
 | 
|    }
 | 
|    Isolate* isolate = Isolate::Current();
 | 
| -  Vector<const char> source = CStrVector(extension->source());
 | 
| -  Handle<String> source_code = isolate->factory()->NewStringFromAscii(source);
 | 
| -  bool result = CompileScriptCached(CStrVector(extension->name()),
 | 
| -                                    source_code,
 | 
| -                                    isolate->bootstrapper()->extensions_cache(),
 | 
| -                                    extension,
 | 
| -                                    Handle<Context>(isolate->context()),
 | 
| -                                    false);
 | 
| +  Handle<String> source_code =
 | 
| +      isolate->factory()->NewExternalStringFromAscii(extension->source());
 | 
| +  bool result = CompileScriptCached(
 | 
| +      CStrVector(extension->name()),
 | 
| +      source_code,
 | 
| +      isolate->bootstrapper()->extensions_cache(),
 | 
| +      extension,
 | 
| +      Handle<Context>(isolate->context()),
 | 
| +      false);
 | 
|    ASSERT(isolate->has_pending_exception() != result);
 | 
|    if (!result) {
 | 
|      isolate->clear_pending_exception();
 | 
| 
 |