| 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 |