OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 20 matching lines...) Expand all Loading... |
31 #include "api.h" | 31 #include "api.h" |
32 #include "bootstrapper.h" | 32 #include "bootstrapper.h" |
33 #include "compiler.h" | 33 #include "compiler.h" |
34 #include "debug.h" | 34 #include "debug.h" |
35 #include "execution.h" | 35 #include "execution.h" |
36 #include "global-handles.h" | 36 #include "global-handles.h" |
37 #include "macro-assembler.h" | 37 #include "macro-assembler.h" |
38 #include "natives.h" | 38 #include "natives.h" |
39 #include "objects-visiting.h" | 39 #include "objects-visiting.h" |
40 #include "snapshot.h" | 40 #include "snapshot.h" |
41 #include "stub-cache.h" | |
42 #include "extensions/externalize-string-extension.h" | 41 #include "extensions/externalize-string-extension.h" |
43 #include "extensions/gc-extension.h" | 42 #include "extensions/gc-extension.h" |
44 | 43 |
45 namespace v8 { | 44 namespace v8 { |
46 namespace internal { | 45 namespace internal { |
47 | 46 |
48 // A SourceCodeCache uses a FixedArray to store pairs of | 47 // A SourceCodeCache uses a FixedArray to store pairs of |
49 // (AsciiString*, JSFunction*), mapping names of native code files | 48 // (AsciiString*, JSFunction*), mapping names of native code files |
50 // (runtime.js, etc.) to precompiled functions. Instead of mapping | 49 // (runtime.js, etc.) to precompiled functions. Instead of mapping |
51 // names to functions it might make sense to let the JS2C tool | 50 // names to functions it might make sense to let the JS2C tool |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
227 // templates passed through the API. The inner global from the snapshot is | 226 // templates passed through the API. The inner global from the snapshot is |
228 // detached from the other objects in the snapshot. | 227 // detached from the other objects in the snapshot. |
229 void HookUpInnerGlobal(Handle<GlobalObject> inner_global); | 228 void HookUpInnerGlobal(Handle<GlobalObject> inner_global); |
230 // New context initialization. Used for creating a context from scratch. | 229 // New context initialization. Used for creating a context from scratch. |
231 void InitializeGlobal(Handle<GlobalObject> inner_global, | 230 void InitializeGlobal(Handle<GlobalObject> inner_global, |
232 Handle<JSFunction> empty_function); | 231 Handle<JSFunction> empty_function); |
233 // Installs the contents of the native .js files on the global objects. | 232 // Installs the contents of the native .js files on the global objects. |
234 // Used for creating a context from scratch. | 233 // Used for creating a context from scratch. |
235 void InstallNativeFunctions(); | 234 void InstallNativeFunctions(); |
236 bool InstallNatives(); | 235 bool InstallNatives(); |
237 void InstallCustomCallGenerators(); | 236 void InstallBuiltinFunctionIds(); |
238 void InstallJSFunctionResultCaches(); | 237 void InstallJSFunctionResultCaches(); |
239 void InitializeNormalizedMapCaches(); | 238 void InitializeNormalizedMapCaches(); |
240 // Used both for deserialized and from-scratch contexts to add the extensions | 239 // Used both for deserialized and from-scratch contexts to add the extensions |
241 // provided. | 240 // provided. |
242 static bool InstallExtensions(Handle<Context> global_context, | 241 static bool InstallExtensions(Handle<Context> global_context, |
243 v8::ExtensionConfiguration* extensions); | 242 v8::ExtensionConfiguration* extensions); |
244 static bool InstallExtension(const char* name); | 243 static bool InstallExtension(const char* name); |
245 static bool InstallExtension(v8::RegisteredExtension* current); | 244 static bool InstallExtension(v8::RegisteredExtension* current); |
246 static void InstallSpecialObjects(Handle<Context> global_context); | 245 static void InstallSpecialObjects(Handle<Context> global_context); |
247 bool InstallJSBuiltins(Handle<JSBuiltinsObject> builtins); | 246 bool InstallJSBuiltins(Handle<JSBuiltinsObject> builtins); |
(...skipping 1015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1263 InstallNativeFunctions(); | 1262 InstallNativeFunctions(); |
1264 | 1263 |
1265 // Store the map for the string prototype after the natives has been compiled | 1264 // Store the map for the string prototype after the natives has been compiled |
1266 // and the String function has been setup. | 1265 // and the String function has been setup. |
1267 Handle<JSFunction> string_function(global_context()->string_function()); | 1266 Handle<JSFunction> string_function(global_context()->string_function()); |
1268 ASSERT(JSObject::cast( | 1267 ASSERT(JSObject::cast( |
1269 string_function->initial_map()->prototype())->HasFastProperties()); | 1268 string_function->initial_map()->prototype())->HasFastProperties()); |
1270 global_context()->set_string_function_prototype_map( | 1269 global_context()->set_string_function_prototype_map( |
1271 HeapObject::cast(string_function->initial_map()->prototype())->map()); | 1270 HeapObject::cast(string_function->initial_map()->prototype())->map()); |
1272 | 1271 |
1273 InstallCustomCallGenerators(); | 1272 InstallBuiltinFunctionIds(); |
1274 | 1273 |
1275 // Install Function.prototype.call and apply. | 1274 // Install Function.prototype.call and apply. |
1276 { Handle<String> key = Factory::function_class_symbol(); | 1275 { Handle<String> key = Factory::function_class_symbol(); |
1277 Handle<JSFunction> function = | 1276 Handle<JSFunction> function = |
1278 Handle<JSFunction>::cast(GetProperty(Top::global(), key)); | 1277 Handle<JSFunction>::cast(GetProperty(Top::global(), key)); |
1279 Handle<JSObject> proto = | 1278 Handle<JSObject> proto = |
1280 Handle<JSObject>(JSObject::cast(function->instance_prototype())); | 1279 Handle<JSObject>(JSObject::cast(function->instance_prototype())); |
1281 | 1280 |
1282 // Install the call and the apply functions. | 1281 // Install the call and the apply functions. |
1283 Handle<JSFunction> call = | 1282 Handle<JSFunction> call = |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1362 } | 1361 } |
1363 | 1362 |
1364 #ifdef DEBUG | 1363 #ifdef DEBUG |
1365 builtins->Verify(); | 1364 builtins->Verify(); |
1366 #endif | 1365 #endif |
1367 | 1366 |
1368 return true; | 1367 return true; |
1369 } | 1368 } |
1370 | 1369 |
1371 | 1370 |
1372 static Handle<JSObject> ResolveCustomCallGeneratorHolder( | 1371 static Handle<JSObject> ResolveBuiltinIdHolder( |
1373 Handle<Context> global_context, | 1372 Handle<Context> global_context, |
1374 const char* holder_expr) { | 1373 const char* holder_expr) { |
1375 Handle<GlobalObject> global(global_context->global()); | 1374 Handle<GlobalObject> global(global_context->global()); |
1376 const char* period_pos = strchr(holder_expr, '.'); | 1375 const char* period_pos = strchr(holder_expr, '.'); |
1377 if (period_pos == NULL) { | 1376 if (period_pos == NULL) { |
1378 return Handle<JSObject>::cast( | 1377 return Handle<JSObject>::cast( |
1379 GetProperty(global, Factory::LookupAsciiSymbol(holder_expr))); | 1378 GetProperty(global, Factory::LookupAsciiSymbol(holder_expr))); |
1380 } | 1379 } |
1381 ASSERT_EQ(".prototype", period_pos); | 1380 ASSERT_EQ(".prototype", period_pos); |
1382 Vector<const char> property(holder_expr, | 1381 Vector<const char> property(holder_expr, |
1383 static_cast<int>(period_pos - holder_expr)); | 1382 static_cast<int>(period_pos - holder_expr)); |
1384 Handle<JSFunction> function = Handle<JSFunction>::cast( | 1383 Handle<JSFunction> function = Handle<JSFunction>::cast( |
1385 GetProperty(global, Factory::LookupSymbol(property))); | 1384 GetProperty(global, Factory::LookupSymbol(property))); |
1386 return Handle<JSObject>(JSObject::cast(function->prototype())); | 1385 return Handle<JSObject>(JSObject::cast(function->prototype())); |
1387 } | 1386 } |
1388 | 1387 |
1389 | 1388 |
1390 static void InstallCustomCallGenerator(Handle<JSObject> holder, | 1389 static void InstallBuiltinFunctionId(Handle<JSObject> holder, |
1391 const char* function_name, | 1390 const char* function_name, |
1392 int id) { | 1391 BuiltinFunctionId id) { |
1393 Handle<String> name = Factory::LookupAsciiSymbol(function_name); | 1392 Handle<String> name = Factory::LookupAsciiSymbol(function_name); |
1394 Object* function_object = holder->GetProperty(*name)->ToObjectUnchecked(); | 1393 Object* function_object = holder->GetProperty(*name)->ToObjectUnchecked(); |
1395 Handle<JSFunction> function(JSFunction::cast(function_object)); | 1394 Handle<JSFunction> function(JSFunction::cast(function_object)); |
1396 function->shared()->set_function_data(Smi::FromInt(id)); | 1395 function->shared()->set_function_data(Smi::FromInt(id)); |
1397 } | 1396 } |
1398 | 1397 |
1399 | 1398 |
1400 void Genesis::InstallCustomCallGenerators() { | 1399 void Genesis::InstallBuiltinFunctionIds() { |
1401 HandleScope scope; | 1400 HandleScope scope; |
1402 #define INSTALL_CALL_GENERATOR(holder_expr, fun_name, name) \ | 1401 #define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \ |
1403 { \ | 1402 { \ |
1404 Handle<JSObject> holder = ResolveCustomCallGeneratorHolder( \ | 1403 Handle<JSObject> holder = ResolveBuiltinIdHolder( \ |
1405 global_context(), #holder_expr); \ | 1404 global_context(), #holder_expr); \ |
1406 const int id = CallStubCompiler::k##name##CallGenerator; \ | 1405 BuiltinFunctionId id = k##name; \ |
1407 InstallCustomCallGenerator(holder, #fun_name, id); \ | 1406 InstallBuiltinFunctionId(holder, #fun_name, id); \ |
1408 } | 1407 } |
1409 CUSTOM_CALL_IC_GENERATORS(INSTALL_CALL_GENERATOR) | 1408 FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID) |
1410 #undef INSTALL_CALL_GENERATOR | 1409 #undef INSTALL_BUILTIN_ID |
1411 } | 1410 } |
1412 | 1411 |
1413 | 1412 |
1414 // Do not forget to update macros.py with named constant | 1413 // Do not forget to update macros.py with named constant |
1415 // of cache id. | 1414 // of cache id. |
1416 #define JSFUNCTION_RESULT_CACHE_LIST(F) \ | 1415 #define JSFUNCTION_RESULT_CACHE_LIST(F) \ |
1417 F(16, global_context()->regexp_function()) | 1416 F(16, global_context()->regexp_function()) |
1418 | 1417 |
1419 | 1418 |
1420 static FixedArray* CreateCache(int size, JSFunction* factory) { | 1419 static FixedArray* CreateCache(int size, JSFunction* factory) { |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1883 } | 1882 } |
1884 | 1883 |
1885 | 1884 |
1886 // Restore statics that are thread local. | 1885 // Restore statics that are thread local. |
1887 char* BootstrapperActive::RestoreState(char* from) { | 1886 char* BootstrapperActive::RestoreState(char* from) { |
1888 nesting_ = *reinterpret_cast<int*>(from); | 1887 nesting_ = *reinterpret_cast<int*>(from); |
1889 return from + sizeof(nesting_); | 1888 return from + sizeof(nesting_); |
1890 } | 1889 } |
1891 | 1890 |
1892 } } // namespace v8::internal | 1891 } } // namespace v8::internal |
OLD | NEW |