Chromium Code Reviews| Index: runtime/vm/dart_api_impl.cc |
| =================================================================== |
| --- runtime/vm/dart_api_impl.cc (revision 25286) |
| +++ runtime/vm/dart_api_impl.cc (working copy) |
| @@ -1072,9 +1072,17 @@ |
| CHECK_ISOLATE(isolate); |
| ApiState* state = isolate->api_state(); |
| ASSERT(state != NULL); |
| - ApiLocalScope* new_scope = new ApiLocalScope(state->top_scope(), |
| - isolate->top_exit_frame_info()); |
| - ASSERT(new_scope != NULL); |
| + ApiLocalScope* new_scope = state->reusable_scope(); |
| + if (new_scope == NULL) { |
| + new_scope = new ApiLocalScope(state->top_scope(), |
| + isolate->top_exit_frame_info()); |
| + ASSERT(new_scope != NULL); |
| + } else { |
| + new_scope->Reinit(isolate, |
| + state->top_scope(), |
| + isolate->top_exit_frame_info()); |
| + state->set_reusable_scope(NULL); |
| + } |
| state->set_top_scope(new_scope); // New scope is now the top scope. |
| } |
| @@ -1084,9 +1092,14 @@ |
| CHECK_ISOLATE_SCOPE(isolate); |
| ApiState* state = isolate->api_state(); |
| ApiLocalScope* scope = state->top_scope(); |
| - |
| + ApiLocalScope* reusable_scope = state->reusable_scope(); |
| state->set_top_scope(scope->previous()); // Reset top scope to previous. |
| - delete scope; // Free up the old scope which we have just exited. |
| + if (reusable_scope == NULL) { |
| + scope->Reset(isolate); // Reset the old scope which we just exited. |
| + state->set_reusable_scope(scope); |
| + } else { |
| + delete scope; |
|
srdjan
2013/07/22 18:18:16
assert reusable_scope != scope
siva
2013/07/22 18:42:09
Done.
|
| + } |
| } |