| Index: src/runtime.cc
 | 
| diff --git a/src/runtime.cc b/src/runtime.cc
 | 
| index 36a2e7189557ad15c777a22c6a74fd3c0beec87e..04ea02bb6cac0641a1b6480a58b1ef854a25cd02 100644
 | 
| --- a/src/runtime.cc
 | 
| +++ b/src/runtime.cc
 | 
| @@ -1238,6 +1238,60 @@ static Object* Runtime_FinishArrayPrototypeSetup(Arguments args) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +static void SetCustomCallGenerator(Handle<JSFunction> function,
 | 
| +                                   CustomCallGenerator generator) {
 | 
| +  if (function->shared()->function_data()->IsUndefined()) {
 | 
| +    function->shared()->set_function_data(*FromCData(generator));
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
| +static Handle<JSFunction> InstallBuiltin(Handle<JSObject> holder,
 | 
| +                                         const char* name,
 | 
| +                                         Builtins::Name builtin_name,
 | 
| +                                         CustomCallGenerator generator = NULL) {
 | 
| +  Handle<String> key = Factory::LookupAsciiSymbol(name);
 | 
| +  Handle<Code> code(Builtins::builtin(builtin_name));
 | 
| +  Handle<JSFunction> optimized = Factory::NewFunction(key,
 | 
| +                                                      JS_OBJECT_TYPE,
 | 
| +                                                      JSObject::kHeaderSize,
 | 
| +                                                      code,
 | 
| +                                                      false);
 | 
| +  optimized->shared()->DontAdaptArguments();
 | 
| +  if (generator != NULL) {
 | 
| +    SetCustomCallGenerator(optimized, generator);
 | 
| +  }
 | 
| +  SetProperty(holder, key, optimized, NONE);
 | 
| +  return optimized;
 | 
| +}
 | 
| +
 | 
| +
 | 
| +static Object* CompileArrayPushCall(CallStubCompiler* compiler,
 | 
| +                                    Object* object,
 | 
| +                                    JSObject* holder,
 | 
| +                                    JSFunction* function,
 | 
| +                                    String* name,
 | 
| +                                    StubCompiler::CheckType check) {
 | 
| +  return compiler->CompileArrayPushCall(object, holder, function, name, check);
 | 
| +}
 | 
| +
 | 
| +
 | 
| +static Object* Runtime_SpecialArrayFunctions(Arguments args) {
 | 
| +  HandleScope scope;
 | 
| +  ASSERT(args.length() == 1);
 | 
| +  CONVERT_ARG_CHECKED(JSObject, holder, 0);
 | 
| +
 | 
| +  InstallBuiltin(holder, "pop", Builtins::ArrayPop);
 | 
| +  InstallBuiltin(holder, "push", Builtins::ArrayPush, CompileArrayPushCall);
 | 
| +  InstallBuiltin(holder, "shift", Builtins::ArrayShift);
 | 
| +  InstallBuiltin(holder, "unshift", Builtins::ArrayUnshift);
 | 
| +  InstallBuiltin(holder, "slice", Builtins::ArraySlice);
 | 
| +  InstallBuiltin(holder, "splice", Builtins::ArraySplice);
 | 
| +
 | 
| +  return *holder;
 | 
| +}
 | 
| +
 | 
| +
 | 
|  static Object* Runtime_MaterializeRegExpLiteral(Arguments args) {
 | 
|    HandleScope scope;
 | 
|    ASSERT(args.length() == 4);
 | 
| @@ -1372,10 +1426,8 @@ static Object* Runtime_FunctionIsAPIFunction(Arguments args) {
 | 
|    ASSERT(args.length() == 1);
 | 
|  
 | 
|    CONVERT_CHECKED(JSFunction, f, args[0]);
 | 
| -  // The function_data field of the shared function info is used exclusively by
 | 
| -  // the API.
 | 
| -  return !f->shared()->function_data()->IsUndefined() ? Heap::true_value()
 | 
| -                                                      : Heap::false_value();
 | 
| +  return f->shared()->IsApiFunction() ? Heap::true_value()
 | 
| +                                      : Heap::false_value();
 | 
|  }
 | 
|  
 | 
|  static Object* Runtime_FunctionIsBuiltin(Arguments args) {
 | 
| 
 |