| Index: src/builtins.cc
|
| diff --git a/src/builtins.cc b/src/builtins.cc
|
| index 97fcaebff5875553bc19e1aa33cd54bf3a61beea..fc7ea0fbd3bb7206843f4bfe52eb22f0a9b16223 100644
|
| --- a/src/builtins.cc
|
| +++ b/src/builtins.cc
|
| @@ -1772,6 +1772,7 @@ struct BuiltinDesc {
|
| int name;
|
| Code::Flags flags;
|
| BuiltinExtraArguments extra_args;
|
| + bool in_snapshot; // whether this builtin should be included in snapshot.
|
| };
|
|
|
| #define BUILTIN_FUNCTION_TABLE_INIT { V8_ONCE_INIT, {} }
|
| @@ -1804,6 +1805,7 @@ void Builtins::InitBuiltinFunctionTable() {
|
| functions[builtin_count].name = builtin_count;
|
| functions[builtin_count].flags = static_cast<Code::Flags>(0);
|
| functions[builtin_count].extra_args = NO_EXTRA_ARGUMENTS;
|
| + functions[builtin_count].in_snapshot = false;
|
|
|
| #define DEF_FUNCTION_PTR_C(aname, aextra_args) \
|
| functions->generator = FUNCTION_ADDR(Generate_Adaptor); \
|
| @@ -1812,9 +1814,10 @@ void Builtins::InitBuiltinFunctionTable() {
|
| functions->name = c_##aname; \
|
| functions->flags = Code::ComputeFlags(Code::BUILTIN); \
|
| functions->extra_args = aextra_args; \
|
| + functions->in_snapshot = true; \
|
| ++functions;
|
|
|
| -#define DEF_FUNCTION_PTR_A(aname, kind, state, extra) \
|
| +#define DEF_FUNCTION_PTR_A(aname, kind, state, extra, in_snapshot_arg) \
|
| functions->generator = FUNCTION_ADDR(Generate_##aname); \
|
| functions->c_code = NULL; \
|
| functions->s_name = #aname; \
|
| @@ -1823,6 +1826,7 @@ void Builtins::InitBuiltinFunctionTable() {
|
| state, \
|
| extra); \
|
| functions->extra_args = NO_EXTRA_ARGUMENTS; \
|
| + functions->in_snapshot = (in_snapshot_arg == IN_SNAPSHOT); \
|
| ++functions;
|
|
|
| BUILTIN_LIST_C(DEF_FUNCTION_PTR_C)
|
| @@ -1833,8 +1837,8 @@ void Builtins::InitBuiltinFunctionTable() {
|
| #undef DEF_FUNCTION_PTR_A
|
| }
|
|
|
| -void Builtins::SetUp(bool create_heap_objects) {
|
| - ASSERT(!initialized_);
|
| +void Builtins::SetUp(bool create_heap_objects, bool after_serialization) {
|
| + ASSERT(!initialized_ || after_serialization);
|
| Isolate* isolate = Isolate::Current();
|
| Heap* heap = isolate->heap();
|
|
|
| @@ -1851,7 +1855,18 @@ void Builtins::SetUp(bool create_heap_objects) {
|
| // Traverse the list of builtins and generate an adaptor in a
|
| // separate code object for each one.
|
| for (int i = 0; i < builtin_count; i++) {
|
| - if (create_heap_objects) {
|
| + if (after_serialization && functions[i].in_snapshot) {
|
| + // This builtin has already been generated.
|
| + continue;
|
| + }
|
| +
|
| + if (create_heap_objects ||
|
| + (after_serialization && !functions[i].in_snapshot)) {
|
| + if (!after_serialization && !functions[i].in_snapshot) {
|
| + // This builtin should not be included in the snapshot.
|
| + continue;
|
| + }
|
| +
|
| MacroAssembler masm(isolate, u.buffer, sizeof u.buffer);
|
| // Generate the code/adaptor.
|
| typedef void (*Generator)(MacroAssembler*, int, BuiltinExtraArguments);
|
| @@ -1935,11 +1950,11 @@ Handle<Code> Builtins::name() { \
|
| reinterpret_cast<Code**>(builtin_address(k##name)); \
|
| return Handle<Code>(code_address); \
|
| }
|
| -#define DEFINE_BUILTIN_ACCESSOR_A(name, kind, state, extra) \
|
| -Handle<Code> Builtins::name() { \
|
| - Code** code_address = \
|
| - reinterpret_cast<Code**>(builtin_address(k##name)); \
|
| - return Handle<Code>(code_address); \
|
| +#define DEFINE_BUILTIN_ACCESSOR_A(name, kind, state, extra, extra2) \
|
| +Handle<Code> Builtins::name() { \
|
| + Code** code_address = \
|
| + reinterpret_cast<Code**>(builtin_address(k##name)); \
|
| + return Handle<Code>(code_address); \
|
| }
|
| BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C)
|
| BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A)
|
|
|