OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 | 6 |
7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/extensions/externalize-string-extension.h" | 9 #include "src/extensions/externalize-string-extension.h" |
10 #include "src/extensions/free-buffer-extension.h" | 10 #include "src/extensions/free-buffer-extension.h" |
(...skipping 1516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1527 Handle<Object> receiver = | 1527 Handle<Object> receiver = |
1528 Handle<Object>(use_runtime_context | 1528 Handle<Object>(use_runtime_context |
1529 ? top_context->builtins() | 1529 ? top_context->builtins() |
1530 : top_context->global_object(), | 1530 : top_context->global_object(), |
1531 isolate); | 1531 isolate); |
1532 return !Execution::Call( | 1532 return !Execution::Call( |
1533 isolate, fun, receiver, 0, NULL).is_null(); | 1533 isolate, fun, receiver, 0, NULL).is_null(); |
1534 } | 1534 } |
1535 | 1535 |
1536 | 1536 |
| 1537 static Handle<JSObject> ResolveBuiltinIdHolder(Handle<Context> native_context, |
| 1538 const char* holder_expr) { |
| 1539 Isolate* isolate = native_context->GetIsolate(); |
| 1540 Factory* factory = isolate->factory(); |
| 1541 Handle<GlobalObject> global(native_context->global_object()); |
| 1542 const char* period_pos = strchr(holder_expr, '.'); |
| 1543 if (period_pos == NULL) { |
| 1544 return Handle<JSObject>::cast( |
| 1545 Object::GetPropertyOrElement( |
| 1546 global, factory->InternalizeUtf8String(holder_expr)) |
| 1547 .ToHandleChecked()); |
| 1548 } |
| 1549 const char* inner = period_pos + 1; |
| 1550 ASSERT_EQ(NULL, strchr(inner, '.')); |
| 1551 Vector<const char> property(holder_expr, |
| 1552 static_cast<int>(period_pos - holder_expr)); |
| 1553 Handle<String> property_string = factory->InternalizeUtf8String(property); |
| 1554 ASSERT(!property_string.is_null()); |
| 1555 Handle<JSObject> object = Handle<JSObject>::cast( |
| 1556 Object::GetProperty(global, property_string).ToHandleChecked()); |
| 1557 if (strcmp("prototype", inner) == 0) { |
| 1558 Handle<JSFunction> function = Handle<JSFunction>::cast(object); |
| 1559 return Handle<JSObject>(JSObject::cast(function->prototype())); |
| 1560 } |
| 1561 Handle<String> inner_string = factory->InternalizeUtf8String(inner); |
| 1562 ASSERT(!inner_string.is_null()); |
| 1563 Handle<Object> value = |
| 1564 Object::GetProperty(object, inner_string).ToHandleChecked(); |
| 1565 return Handle<JSObject>::cast(value); |
| 1566 } |
| 1567 |
| 1568 |
1537 #define INSTALL_NATIVE(Type, name, var) \ | 1569 #define INSTALL_NATIVE(Type, name, var) \ |
1538 Handle<String> var##_name = \ | 1570 Handle<String> var##_name = \ |
1539 factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR(name)); \ | 1571 factory()->InternalizeOneByteString(STATIC_ASCII_VECTOR(name)); \ |
1540 Handle<Object> var##_native = Object::GetProperty( \ | 1572 Handle<Object> var##_native = Object::GetProperty( \ |
1541 handle(native_context()->builtins()), var##_name).ToHandleChecked(); \ | 1573 handle(native_context()->builtins()), var##_name).ToHandleChecked(); \ |
1542 native_context()->set_##var(Type::cast(*var##_native)); | 1574 native_context()->set_##var(Type::cast(*var##_native)); |
1543 | 1575 |
| 1576 #define INSTALL_NATIVE_MATH(name) \ |
| 1577 { \ |
| 1578 Handle<Object> fun = \ |
| 1579 ResolveBuiltinIdHolder(native_context(), "Math." #name); \ |
| 1580 native_context()->set_math_##name##_fun(JSFunction::cast(*fun)); \ |
| 1581 } |
1544 | 1582 |
1545 void Genesis::InstallNativeFunctions() { | 1583 void Genesis::InstallNativeFunctions() { |
1546 HandleScope scope(isolate()); | 1584 HandleScope scope(isolate()); |
1547 INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun); | 1585 INSTALL_NATIVE(JSFunction, "CreateDate", create_date_fun); |
1548 | 1586 |
1549 INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun); | 1587 INSTALL_NATIVE(JSFunction, "ToNumber", to_number_fun); |
1550 INSTALL_NATIVE(JSFunction, "ToString", to_string_fun); | 1588 INSTALL_NATIVE(JSFunction, "ToString", to_string_fun); |
1551 INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun); | 1589 INSTALL_NATIVE(JSFunction, "ToDetailString", to_detail_string_fun); |
1552 INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun); | 1590 INSTALL_NATIVE(JSFunction, "ToObject", to_object_fun); |
1553 INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun); | 1591 INSTALL_NATIVE(JSFunction, "ToInteger", to_integer_fun); |
(...skipping 22 matching lines...) Expand all Loading... |
1576 INSTALL_NATIVE(JSFunction, "BeginPerformSplice", | 1614 INSTALL_NATIVE(JSFunction, "BeginPerformSplice", |
1577 observers_begin_perform_splice); | 1615 observers_begin_perform_splice); |
1578 INSTALL_NATIVE(JSFunction, "EndPerformSplice", | 1616 INSTALL_NATIVE(JSFunction, "EndPerformSplice", |
1579 observers_end_perform_splice); | 1617 observers_end_perform_splice); |
1580 INSTALL_NATIVE(JSFunction, "NativeObjectObserve", | 1618 INSTALL_NATIVE(JSFunction, "NativeObjectObserve", |
1581 native_object_observe); | 1619 native_object_observe); |
1582 INSTALL_NATIVE(JSFunction, "NativeObjectGetNotifier", | 1620 INSTALL_NATIVE(JSFunction, "NativeObjectGetNotifier", |
1583 native_object_get_notifier); | 1621 native_object_get_notifier); |
1584 INSTALL_NATIVE(JSFunction, "NativeObjectNotifierPerformChange", | 1622 INSTALL_NATIVE(JSFunction, "NativeObjectNotifierPerformChange", |
1585 native_object_notifier_perform_change); | 1623 native_object_notifier_perform_change); |
| 1624 |
| 1625 INSTALL_NATIVE_MATH(abs) |
| 1626 INSTALL_NATIVE_MATH(acos) |
| 1627 INSTALL_NATIVE_MATH(asin) |
| 1628 INSTALL_NATIVE_MATH(atan) |
| 1629 INSTALL_NATIVE_MATH(atan2) |
| 1630 INSTALL_NATIVE_MATH(ceil) |
| 1631 INSTALL_NATIVE_MATH(cos) |
| 1632 INSTALL_NATIVE_MATH(exp) |
| 1633 INSTALL_NATIVE_MATH(floor) |
| 1634 INSTALL_NATIVE_MATH(imul) |
| 1635 INSTALL_NATIVE_MATH(log) |
| 1636 INSTALL_NATIVE_MATH(max) |
| 1637 INSTALL_NATIVE_MATH(min) |
| 1638 INSTALL_NATIVE_MATH(pow) |
| 1639 INSTALL_NATIVE_MATH(random) |
| 1640 INSTALL_NATIVE_MATH(round) |
| 1641 INSTALL_NATIVE_MATH(sin) |
| 1642 INSTALL_NATIVE_MATH(sqrt) |
| 1643 INSTALL_NATIVE_MATH(tan) |
1586 } | 1644 } |
1587 | 1645 |
1588 | 1646 |
1589 void Genesis::InstallExperimentalNativeFunctions() { | 1647 void Genesis::InstallExperimentalNativeFunctions() { |
1590 if (FLAG_harmony_proxies) { | 1648 if (FLAG_harmony_proxies) { |
1591 INSTALL_NATIVE(JSFunction, "DerivedHasTrap", derived_has_trap); | 1649 INSTALL_NATIVE(JSFunction, "DerivedHasTrap", derived_has_trap); |
1592 INSTALL_NATIVE(JSFunction, "DerivedGetTrap", derived_get_trap); | 1650 INSTALL_NATIVE(JSFunction, "DerivedGetTrap", derived_get_trap); |
1593 INSTALL_NATIVE(JSFunction, "DerivedSetTrap", derived_set_trap); | 1651 INSTALL_NATIVE(JSFunction, "DerivedSetTrap", derived_set_trap); |
1594 INSTALL_NATIVE(JSFunction, "ProxyEnumerate", proxy_enumerate); | 1652 INSTALL_NATIVE(JSFunction, "ProxyEnumerate", proxy_enumerate); |
1595 } | 1653 } |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2022 INSTALL_EXPERIMENTAL_NATIVE(i, iteration, "string-iterator.js") | 2080 INSTALL_EXPERIMENTAL_NATIVE(i, iteration, "string-iterator.js") |
2023 INSTALL_EXPERIMENTAL_NATIVE(i, strings, "harmony-string.js") | 2081 INSTALL_EXPERIMENTAL_NATIVE(i, strings, "harmony-string.js") |
2024 INSTALL_EXPERIMENTAL_NATIVE(i, arrays, "harmony-array.js") | 2082 INSTALL_EXPERIMENTAL_NATIVE(i, arrays, "harmony-array.js") |
2025 } | 2083 } |
2026 | 2084 |
2027 InstallExperimentalNativeFunctions(); | 2085 InstallExperimentalNativeFunctions(); |
2028 return true; | 2086 return true; |
2029 } | 2087 } |
2030 | 2088 |
2031 | 2089 |
2032 static Handle<JSObject> ResolveBuiltinIdHolder( | |
2033 Handle<Context> native_context, | |
2034 const char* holder_expr) { | |
2035 Isolate* isolate = native_context->GetIsolate(); | |
2036 Factory* factory = isolate->factory(); | |
2037 Handle<GlobalObject> global(native_context->global_object()); | |
2038 const char* period_pos = strchr(holder_expr, '.'); | |
2039 if (period_pos == NULL) { | |
2040 return Handle<JSObject>::cast(Object::GetPropertyOrElement( | |
2041 global, factory->InternalizeUtf8String(holder_expr)).ToHandleChecked()); | |
2042 } | |
2043 ASSERT_EQ(".prototype", period_pos); | |
2044 Vector<const char> property(holder_expr, | |
2045 static_cast<int>(period_pos - holder_expr)); | |
2046 Handle<String> property_string = factory->InternalizeUtf8String(property); | |
2047 ASSERT(!property_string.is_null()); | |
2048 Handle<JSFunction> function = Handle<JSFunction>::cast( | |
2049 Object::GetProperty(global, property_string).ToHandleChecked()); | |
2050 return Handle<JSObject>(JSObject::cast(function->prototype())); | |
2051 } | |
2052 | |
2053 | |
2054 static void InstallBuiltinFunctionId(Handle<JSObject> holder, | 2090 static void InstallBuiltinFunctionId(Handle<JSObject> holder, |
2055 const char* function_name, | 2091 const char* function_name, |
2056 BuiltinFunctionId id) { | 2092 BuiltinFunctionId id) { |
2057 Isolate* isolate = holder->GetIsolate(); | 2093 Isolate* isolate = holder->GetIsolate(); |
2058 Handle<Object> function_object = | 2094 Handle<Object> function_object = |
2059 Object::GetProperty(isolate, holder, function_name).ToHandleChecked(); | 2095 Object::GetProperty(isolate, holder, function_name).ToHandleChecked(); |
2060 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 2096 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); |
2061 function->shared()->set_function_data(Smi::FromInt(id)); | 2097 function->shared()->set_function_data(Smi::FromInt(id)); |
2062 } | 2098 } |
2063 | 2099 |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2329 | 2365 |
2330 | 2366 |
2331 bool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) { | 2367 bool Genesis::InstallJSBuiltins(Handle<JSBuiltinsObject> builtins) { |
2332 HandleScope scope(isolate()); | 2368 HandleScope scope(isolate()); |
2333 for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) { | 2369 for (int i = 0; i < Builtins::NumberOfJavaScriptBuiltins(); i++) { |
2334 Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i); | 2370 Builtins::JavaScript id = static_cast<Builtins::JavaScript>(i); |
2335 Handle<Object> function_object = Object::GetProperty( | 2371 Handle<Object> function_object = Object::GetProperty( |
2336 isolate(), builtins, Builtins::GetName(id)).ToHandleChecked(); | 2372 isolate(), builtins, Builtins::GetName(id)).ToHandleChecked(); |
2337 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); | 2373 Handle<JSFunction> function = Handle<JSFunction>::cast(function_object); |
2338 builtins->set_javascript_builtin(id, *function); | 2374 builtins->set_javascript_builtin(id, *function); |
| 2375 // TODO(mstarzinger): This is just a temporary hack to make TurboFan work, |
| 2376 // the correct solution is to restore the context register after invoking |
| 2377 // builtins from full-codegen. |
| 2378 function->shared()->set_optimization_disabled(true); |
2339 if (!Compiler::EnsureCompiled(function, CLEAR_EXCEPTION)) { | 2379 if (!Compiler::EnsureCompiled(function, CLEAR_EXCEPTION)) { |
2340 return false; | 2380 return false; |
2341 } | 2381 } |
2342 builtins->set_javascript_builtin_code(id, function->shared()->code()); | 2382 builtins->set_javascript_builtin_code(id, function->shared()->code()); |
2343 } | 2383 } |
2344 return true; | 2384 return true; |
2345 } | 2385 } |
2346 | 2386 |
2347 | 2387 |
2348 bool Genesis::ConfigureGlobalObjects( | 2388 bool Genesis::ConfigureGlobalObjects( |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2693 return from + sizeof(NestingCounterType); | 2733 return from + sizeof(NestingCounterType); |
2694 } | 2734 } |
2695 | 2735 |
2696 | 2736 |
2697 // Called when the top-level V8 mutex is destroyed. | 2737 // Called when the top-level V8 mutex is destroyed. |
2698 void Bootstrapper::FreeThreadResources() { | 2738 void Bootstrapper::FreeThreadResources() { |
2699 ASSERT(!IsActive()); | 2739 ASSERT(!IsActive()); |
2700 } | 2740 } |
2701 | 2741 |
2702 } } // namespace v8::internal | 2742 } } // namespace v8::internal |
OLD | NEW |