Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: src/runtime.cc

Issue 6725030: [Arguments] Introduce a new backing store for non-strict arguments objects. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/arguments
Patch Set: Created 9 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 7164 matching lines...) Expand 10 before | Expand all | Expand 10 after
7175 elms->set(0, Smi::FromInt(year)); 7175 elms->set(0, Smi::FromInt(year));
7176 elms->set(1, Smi::FromInt(month)); 7176 elms->set(1, Smi::FromInt(month));
7177 elms->set(2, Smi::FromInt(day)); 7177 elms->set(2, Smi::FromInt(day));
7178 7178
7179 return isolate->heap()->undefined_value(); 7179 return isolate->heap()->undefined_value();
7180 } 7180 }
7181 7181
7182 7182
7183 static MaybeObject* Runtime_NewArgumentsFast(RUNTIME_CALLING_CONVENTION) { 7183 static MaybeObject* Runtime_NewArgumentsFast(RUNTIME_CALLING_CONVENTION) {
7184 RUNTIME_GET_ISOLATE; 7184 RUNTIME_GET_ISOLATE;
7185 HandleScope scope(isolate);
7186 ASSERT(args.length() == 3);
7187
7188 Handle<JSFunction> callee = args.at<JSFunction>(0);
7189 Object** parameters = reinterpret_cast<Object**>(args[1]);
7190 const int argument_count = Smi::cast(args[2])->value();
7191
7192 Handle<JSObject> result =
7193 isolate->factory()->NewArgumentsObject(callee, argument_count);
7194 // Allocate the elements if needed.
7195 int parameter_count = callee->shared()->formal_parameter_count();
7196 if (argument_count > 0) {
Kevin Millikin (Chromium) 2011/03/23 16:07:20 I'm aware this is monolithic. There will eventual
7197 if (parameter_count > 0) {
7198 int mapped_count = Min(argument_count, parameter_count);
7199 Handle<FixedArray> parameter_map =
7200 isolate->factory()->NewFixedArray(mapped_count + 2, NOT_TENURED);
7201 parameter_map->set_map(
7202 isolate->heap()->non_strict_arguments_elements_map());
7203
7204 Handle<Map> old_map(result->map());
7205 Handle<Map> new_map =
7206 isolate->factory()->CopyMapDropTransitions(old_map);
7207 new_map->set_has_fast_elements(false);
7208
7209 result->set_map(*new_map);
7210 result->set_elements(*parameter_map);
7211
7212 // Store the context and the arguments array at the end of the
Mads Ager (chromium) 2011/03/24 08:04:04 end -> beginning? elements array -> parameter map
Kevin Millikin (Chromium) 2011/03/24 08:42:51 Thanks. Those were some stale comments.
7213 // elements array.
7214 Handle<Context> context(isolate->context());
7215 Handle<FixedArray> arguments =
7216 isolate->factory()->NewFixedArray(argument_count, NOT_TENURED);
7217 parameter_map->set(0, *context);
7218 parameter_map->set(1, *arguments);
7219
7220 // Loop over the actual parameters backwards.
7221 int index = argument_count - 1;
7222 while (index >= mapped_count) {
7223 // These go directly in the arguments array and have no
7224 // corresponding slot in the elements array.
7225 arguments->set(index, *(parameters - index - 1));
7226 --index;
7227 }
7228
7229 ScopeInfo<> scope_info(callee->shared()->scope_info());
7230 while (index >= 0) {
7231 // Detect duplicate names.
7232 Handle<String> name = scope_info.parameter_name(index);
7233 int context_slot_count = scope_info.number_of_context_slots();
7234 bool duplicate = false;
7235 for (int j = 0; j < index; ++j) {
7236 if (scope_info.parameter_name(j).is_identical_to(name)) {
7237 duplicate = true;
7238 break;
7239 }
7240 }
7241
7242 if (duplicate) {
7243 // This goes directly in the arguments array with a hole in the
7244 // elements array.
Mads Ager (chromium) 2011/03/24 08:04:04 elements array -> parameter map
7245 arguments->set(index, *(parameters - index - 1));
7246 parameter_map->set_the_hole(index + 2);
7247 } else {
7248 // The context index goes in the elements array with a hole in the
Mads Ager (chromium) 2011/03/24 08:04:04 elements array -> parameter map
7249 // arguments array.
7250 int context_index = -1;
7251 for (int j = Context::MIN_CONTEXT_SLOTS;
7252 j < context_slot_count;
7253 ++j) {
7254 if (scope_info.context_slot_name(j).is_identical_to(name)) {
7255 context_index = j;
7256 break;
7257 }
7258 }
7259 ASSERT(context_index >= 0);
7260 arguments->set_the_hole(index);
7261 parameter_map->set(index + 2, Smi::FromInt(context_index));
7262 }
7263
7264 --index;
7265 }
7266 } else {
7267 Handle<FixedArray> elements =
7268 isolate->factory()->NewFixedArray(argument_count, NOT_TENURED);
7269 result->set_elements(*elements);
7270 for (int i = 0; i < argument_count; ++i) {
7271 elements->set(i, *(parameters - i - 1));
7272 }
7273 }
7274 }
7275 return *result;
7276 }
7277
7278
7279 static MaybeObject* Runtime_NewStrictArgumentsFast(RUNTIME_CALLING_CONVENTION) {
7280 RUNTIME_GET_ISOLATE;
7185 NoHandleAllocation ha; 7281 NoHandleAllocation ha;
7186 ASSERT(args.length() == 3); 7282 ASSERT(args.length() == 3);
7187 7283
7188 JSFunction* callee = JSFunction::cast(args[0]); 7284 JSFunction* callee = JSFunction::cast(args[0]);
7189 Object** parameters = reinterpret_cast<Object**>(args[1]); 7285 Object** parameters = reinterpret_cast<Object**>(args[1]);
7190 const int length = Smi::cast(args[2])->value(); 7286 const int length = Smi::cast(args[2])->value();
7191 7287
7192 Object* result; 7288 Object* result;
7193 { MaybeObject* maybe_result = 7289 { MaybeObject* maybe_result =
7194 isolate->heap()->AllocateArgumentsObject(callee, length); 7290 isolate->heap()->AllocateArgumentsObject(callee, length);
(...skipping 3481 matching lines...) Expand 10 before | Expand all | Expand 10 after
10676 10772
10677 if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) { 10773 if (sinfo->number_of_context_slots() > Context::MIN_CONTEXT_SLOTS) {
10678 index = scope_info->ContextSlotIndex(isolate->heap()->arguments_symbol(), 10774 index = scope_info->ContextSlotIndex(isolate->heap()->arguments_symbol(),
10679 NULL); 10775 NULL);
10680 if (index != -1) { 10776 if (index != -1) {
10681 return Handle<Object>(function_context->get(index), isolate); 10777 return Handle<Object>(function_context->get(index), isolate);
10682 } 10778 }
10683 } 10779 }
10684 10780
10685 const int length = frame->ComputeParametersCount(); 10781 const int length = frame->ComputeParametersCount();
10782 UNIMPLEMENTED();
10686 Handle<JSObject> arguments = 10783 Handle<JSObject> arguments =
10687 isolate->factory()->NewArgumentsObject(function, length); 10784 isolate->factory()->NewArgumentsObject(function, length);
10688 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length); 10785 Handle<FixedArray> array = isolate->factory()->NewFixedArray(length);
10689 10786
10690 AssertNoAllocation no_gc; 10787 AssertNoAllocation no_gc;
10691 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc); 10788 WriteBarrierMode mode = array->GetWriteBarrierMode(no_gc);
10692 for (int i = 0; i < length; i++) { 10789 for (int i = 0; i < length; i++) {
10693 array->set(i, frame->GetParameter(i), mode); 10790 array->set(i, frame->GetParameter(i), mode);
10694 } 10791 }
10695 arguments->set_elements(*array); 10792 arguments->set_elements(*array);
(...skipping 1503 matching lines...) Expand 10 before | Expand all | Expand 10 after
12199 } else { 12296 } else {
12200 // Handle last resort GC and make sure to allow future allocations 12297 // Handle last resort GC and make sure to allow future allocations
12201 // to grow the heap without causing GCs (if possible). 12298 // to grow the heap without causing GCs (if possible).
12202 COUNTERS->gc_last_resort_from_js()->Increment(); 12299 COUNTERS->gc_last_resort_from_js()->Increment();
12203 HEAP->CollectAllGarbage(false); 12300 HEAP->CollectAllGarbage(false);
12204 } 12301 }
12205 } 12302 }
12206 12303
12207 12304
12208 } } // namespace v8::internal 12305 } } // namespace v8::internal
OLDNEW
« src/objects.cc ('K') | « src/runtime.h ('k') | src/x64/code-stubs-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698