OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 ASSERT(args.length() == 1); | 1233 ASSERT(args.length() == 1); |
1234 CONVERT_ARG_CHECKED(JSArray, prototype, 0); | 1234 CONVERT_ARG_CHECKED(JSArray, prototype, 0); |
1235 // This is necessary to enable fast checks for absence of elements | 1235 // This is necessary to enable fast checks for absence of elements |
1236 // on Array.prototype and below. | 1236 // on Array.prototype and below. |
1237 prototype->set_elements(Heap::empty_fixed_array()); | 1237 prototype->set_elements(Heap::empty_fixed_array()); |
1238 return Smi::FromInt(0); | 1238 return Smi::FromInt(0); |
1239 } | 1239 } |
1240 | 1240 |
1241 | 1241 |
1242 static void SetCustomCallGenerator(Handle<JSFunction> function, | 1242 static void SetCustomCallGenerator(Handle<JSFunction> function, |
1243 CustomCallGenerator generator) { | 1243 ExternalReference* generator) { |
1244 if (function->shared()->function_data()->IsUndefined()) { | 1244 if (function->shared()->function_data()->IsUndefined()) { |
1245 function->shared()->set_function_data(*FromCData(generator)); | 1245 function->shared()->set_function_data(*FromCData(generator->address())); |
1246 } | 1246 } |
1247 } | 1247 } |
1248 | 1248 |
1249 | 1249 |
1250 static Handle<JSFunction> InstallBuiltin(Handle<JSObject> holder, | 1250 static Handle<JSFunction> InstallBuiltin(Handle<JSObject> holder, |
1251 const char* name, | 1251 const char* name, |
1252 Builtins::Name builtin_name, | 1252 Builtins::Name builtin_name, |
1253 CustomCallGenerator generator = NULL) { | 1253 ExternalReference* generator = NULL) { |
1254 Handle<String> key = Factory::LookupAsciiSymbol(name); | 1254 Handle<String> key = Factory::LookupAsciiSymbol(name); |
1255 Handle<Code> code(Builtins::builtin(builtin_name)); | 1255 Handle<Code> code(Builtins::builtin(builtin_name)); |
1256 Handle<JSFunction> optimized = Factory::NewFunction(key, | 1256 Handle<JSFunction> optimized = Factory::NewFunction(key, |
1257 JS_OBJECT_TYPE, | 1257 JS_OBJECT_TYPE, |
1258 JSObject::kHeaderSize, | 1258 JSObject::kHeaderSize, |
1259 code, | 1259 code, |
1260 false); | 1260 false); |
1261 optimized->shared()->DontAdaptArguments(); | 1261 optimized->shared()->DontAdaptArguments(); |
1262 if (generator != NULL) { | 1262 if (generator != NULL) { |
1263 SetCustomCallGenerator(optimized, generator); | 1263 SetCustomCallGenerator(optimized, generator); |
1264 } | 1264 } |
1265 SetProperty(holder, key, optimized, NONE); | 1265 SetProperty(holder, key, optimized, NONE); |
1266 return optimized; | 1266 return optimized; |
1267 } | 1267 } |
1268 | 1268 |
1269 | 1269 |
1270 static Object* CompileArrayPushCall(CallStubCompiler* compiler, | 1270 Object* CompileArrayPushCall(CallStubCompiler* compiler, |
1271 Object* object, | 1271 Object* object, |
1272 JSObject* holder, | 1272 JSObject* holder, |
1273 JSFunction* function, | 1273 JSFunction* function, |
1274 String* name, | 1274 String* name, |
1275 StubCompiler::CheckType check) { | 1275 StubCompiler::CheckType check) { |
1276 return compiler->CompileArrayPushCall(object, holder, function, name, check); | 1276 return compiler->CompileArrayPushCall(object, holder, function, name, check); |
1277 } | 1277 } |
1278 | 1278 |
1279 | 1279 |
1280 static Object* CompileArrayPopCall(CallStubCompiler* compiler, | 1280 Object* CompileArrayPopCall(CallStubCompiler* compiler, |
1281 Object* object, | 1281 Object* object, |
1282 JSObject* holder, | 1282 JSObject* holder, |
1283 JSFunction* function, | 1283 JSFunction* function, |
1284 String* name, | 1284 String* name, |
1285 StubCompiler::CheckType check) { | 1285 StubCompiler::CheckType check) { |
1286 return compiler->CompileArrayPopCall(object, holder, function, name, check); | 1286 return compiler->CompileArrayPopCall(object, holder, function, name, check); |
1287 } | 1287 } |
1288 | 1288 |
1289 | 1289 |
1290 static Object* Runtime_SpecialArrayFunctions(Arguments args) { | 1290 static Object* Runtime_SpecialArrayFunctions(Arguments args) { |
1291 HandleScope scope; | 1291 HandleScope scope; |
1292 ASSERT(args.length() == 1); | 1292 ASSERT(args.length() == 1); |
1293 CONVERT_ARG_CHECKED(JSObject, holder, 0); | 1293 CONVERT_ARG_CHECKED(JSObject, holder, 0); |
1294 | 1294 |
1295 InstallBuiltin(holder, "pop", Builtins::ArrayPop, CompileArrayPopCall); | 1295 ExternalReference pop = ExternalReference::compile_array_pop_call(); |
1296 InstallBuiltin(holder, "push", Builtins::ArrayPush, CompileArrayPushCall); | 1296 ExternalReference push = ExternalReference::compile_array_push_call(); |
| 1297 |
| 1298 InstallBuiltin(holder, "pop", Builtins::ArrayPop, &pop); |
| 1299 InstallBuiltin(holder, "push", Builtins::ArrayPush, &push); |
1297 InstallBuiltin(holder, "shift", Builtins::ArrayShift); | 1300 InstallBuiltin(holder, "shift", Builtins::ArrayShift); |
1298 InstallBuiltin(holder, "unshift", Builtins::ArrayUnshift); | 1301 InstallBuiltin(holder, "unshift", Builtins::ArrayUnshift); |
1299 InstallBuiltin(holder, "slice", Builtins::ArraySlice); | 1302 InstallBuiltin(holder, "slice", Builtins::ArraySlice); |
1300 InstallBuiltin(holder, "splice", Builtins::ArraySplice); | 1303 InstallBuiltin(holder, "splice", Builtins::ArraySplice); |
1301 InstallBuiltin(holder, "concat", Builtins::ArrayConcat); | 1304 InstallBuiltin(holder, "concat", Builtins::ArrayConcat); |
1302 | 1305 |
1303 return *holder; | 1306 return *holder; |
1304 } | 1307 } |
1305 | 1308 |
1306 | 1309 |
(...skipping 8118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9425 } else { | 9428 } else { |
9426 // Handle last resort GC and make sure to allow future allocations | 9429 // Handle last resort GC and make sure to allow future allocations |
9427 // to grow the heap without causing GCs (if possible). | 9430 // to grow the heap without causing GCs (if possible). |
9428 Counters::gc_last_resort_from_js.Increment(); | 9431 Counters::gc_last_resort_from_js.Increment(); |
9429 Heap::CollectAllGarbage(false); | 9432 Heap::CollectAllGarbage(false); |
9430 } | 9433 } |
9431 } | 9434 } |
9432 | 9435 |
9433 | 9436 |
9434 } } // namespace v8::internal | 9437 } } // namespace v8::internal |
OLD | NEW |