| Index: src/builtins.cc
|
| ===================================================================
|
| --- src/builtins.cc (revision 3427)
|
| +++ src/builtins.cc (working copy)
|
| @@ -136,7 +136,7 @@
|
|
|
|
|
| BUILTIN(ArrayCodeGeneric) {
|
| - Counters::array_function_runtime.Increment();
|
| + INC_COUNTER(array_function_runtime);
|
|
|
| JSArray* array;
|
| if (CalledAsConstructor()) {
|
| @@ -326,7 +326,8 @@
|
|
|
| // TODO(428): Remove use of static variable, handle API callbacks directly.
|
| Handle<JSFunction> function =
|
| - Handle<JSFunction>(JSFunction::cast(Builtins::builtin_passed_function));
|
| + Handle<JSFunction>(JSFunction::cast(
|
| + v8_context()->builtins_data_.builtin_passed_function_));
|
|
|
| if (is_construct) {
|
| Handle<FunctionTemplateInfo> desc =
|
| @@ -482,13 +483,7 @@
|
| BUILTIN_END
|
|
|
|
|
| -// TODO(1238487): This is a nasty hack. We need to improve the way we
|
| -// call builtins considerable to get rid of this and the hairy macros
|
| -// in builtins.cc.
|
| -Object* Builtins::builtin_passed_function;
|
|
|
| -
|
| -
|
| static void Generate_LoadIC_ArrayLength(MacroAssembler* masm) {
|
| LoadIC::GenerateArrayLength(masm);
|
| }
|
| @@ -700,8 +695,13 @@
|
| }
|
| #endif
|
|
|
| -Object* Builtins::builtins_[builtin_count] = { NULL, };
|
| -const char* Builtins::names_[builtin_count] = { NULL, };
|
| +BuiltinsData::BuiltinsData()
|
| + :is_initialized_(false), builtin_passed_function_(NULL) {
|
| + for (int i = 0; i < builtin_count; ++i) {
|
| + builtins_[i] = NULL;
|
| + names_[i] = NULL;
|
| + }
|
| +}
|
|
|
| #define DEF_ENUM_C(name) FUNCTION_ADDR(Builtin_##name),
|
| Address Builtins::c_functions_[cfunction_count] = {
|
| @@ -721,9 +721,9 @@
|
| #undef DEF_JS_NAME
|
| #undef DEF_JS_ARGC
|
|
|
| -static bool is_initialized = false;
|
| void Builtins::Setup(bool create_heap_objects) {
|
| - ASSERT(!is_initialized);
|
| + BuiltinsData& data = v8_context()->builtins_data_;
|
| + ASSERT(!data.is_initialized_);
|
|
|
| // Create a scope for the handles in the builtins.
|
| HandleScope scope;
|
| @@ -800,7 +800,7 @@
|
| // Log the event and add the code to the builtins array.
|
| LOG(CodeCreateEvent(Logger::BUILTIN_TAG,
|
| Code::cast(code), functions[i].s_name));
|
| - builtins_[i] = code;
|
| + data.builtins_[i] = code;
|
| #ifdef ENABLE_DISASSEMBLER
|
| if (FLAG_print_builtin_code) {
|
| PrintF("Builtin: %s\n", functions[i].s_name);
|
| @@ -810,32 +810,35 @@
|
| #endif
|
| } else {
|
| // Deserializing. The values will be filled in during IterateBuiltins.
|
| - builtins_[i] = NULL;
|
| + data.builtins_[i] = NULL;
|
| }
|
| - names_[i] = functions[i].s_name;
|
| + data.names_[i] = functions[i].s_name;
|
| }
|
|
|
| // Mark as initialized.
|
| - is_initialized = true;
|
| + data.is_initialized_ = true;
|
| }
|
|
|
|
|
| void Builtins::TearDown() {
|
| - is_initialized = false;
|
| + v8_context()->builtins_data_.is_initialized_ = false;
|
| }
|
|
|
|
|
| void Builtins::IterateBuiltins(ObjectVisitor* v) {
|
| - v->VisitPointers(&builtins_[0], &builtins_[0] + builtin_count);
|
| + BuiltinsData& data = v8_context()->builtins_data_;
|
| + v->VisitPointers(&data.builtins_[0], &data.builtins_[0] + builtin_count);
|
| }
|
|
|
|
|
| const char* Builtins::Lookup(byte* pc) {
|
| - if (is_initialized) { // may be called during initialization (disassembler!)
|
| + BuiltinsData& data = v8_context()->builtins_data_;
|
| + if (data.is_initialized_) {
|
| + // may be called during initialization (disassembler!)
|
| for (int i = 0; i < builtin_count; i++) {
|
| - Code* entry = Code::cast(builtins_[i]);
|
| + Code* entry = Code::cast(data.builtins_[i]);
|
| if (entry->contains(pc)) {
|
| - return names_[i];
|
| + return data.names_[i];
|
| }
|
| }
|
| }
|
|
|