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

Side by Side Diff: src/arm/stub-cache-arm.cc

Issue 11365221: Allow property indexes to refer to slots inside the object header. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 8 years, 1 month 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
« no previous file with comments | « no previous file | src/bootstrapper.cc » ('j') | src/property.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 309 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 } 320 }
321 321
322 322
323 // Load a fast property out of a holder object (src). In-object properties 323 // Load a fast property out of a holder object (src). In-object properties
324 // are loaded directly otherwise the property is loaded from the properties 324 // are loaded directly otherwise the property is loaded from the properties
325 // fixed array. 325 // fixed array.
326 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm, 326 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm,
327 Register dst, 327 Register dst,
328 Register src, 328 Register src,
329 Handle<JSObject> holder, 329 Handle<JSObject> holder,
330 int index) { 330 PropertyIndex index) {
331 // Adjust for the number of properties stored in the holder. 331 if (index.IsHeaderIndex()) {
332 index -= holder->map()->inobject_properties(); 332 int offset = index.HeaderIndex() * kPointerSize;
333 if (index < 0) {
334 // Get the property straight out of the holder.
335 int offset = holder->map()->instance_size() + (index * kPointerSize);
336 __ ldr(dst, FieldMemOperand(src, offset)); 333 __ ldr(dst, FieldMemOperand(src, offset));
337 } else { 334 } else {
338 // Calculate the offset into the properties array. 335 // Adjust for the number of properties stored in the holder.
339 int offset = index * kPointerSize + FixedArray::kHeaderSize; 336 int slot = index.FieldIndex() - holder->map()->inobject_properties();
340 __ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset)); 337 if (slot < 0) {
341 __ ldr(dst, FieldMemOperand(dst, offset)); 338 // Get the property straight out of the holder.
339 int offset = holder->map()->instance_size() + (slot * kPointerSize);
340 __ ldr(dst, FieldMemOperand(src, offset));
341 } else {
342 // Calculate the offset into the properties array.
343 int offset = slot * kPointerSize + FixedArray::kHeaderSize;
344 __ ldr(dst, FieldMemOperand(src, JSObject::kPropertiesOffset));
345 __ ldr(dst, FieldMemOperand(dst, offset));
346 }
342 } 347 }
343 } 348 }
344 349
345 350
346 void StubCompiler::GenerateLoadArrayLength(MacroAssembler* masm, 351 void StubCompiler::GenerateLoadArrayLength(MacroAssembler* masm,
347 Register receiver, 352 Register receiver,
348 Register scratch, 353 Register scratch,
349 Label* miss_label) { 354 Label* miss_label) {
350 // Check that the receiver isn't a smi. 355 // Check that the receiver isn't a smi.
351 __ JumpIfSmi(receiver, miss_label); 356 __ JumpIfSmi(receiver, miss_label);
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after
1189 return reg; 1194 return reg;
1190 } 1195 }
1191 1196
1192 1197
1193 void StubCompiler::GenerateLoadField(Handle<JSObject> object, 1198 void StubCompiler::GenerateLoadField(Handle<JSObject> object,
1194 Handle<JSObject> holder, 1199 Handle<JSObject> holder,
1195 Register receiver, 1200 Register receiver,
1196 Register scratch1, 1201 Register scratch1,
1197 Register scratch2, 1202 Register scratch2,
1198 Register scratch3, 1203 Register scratch3,
1199 int index, 1204 PropertyIndex index,
1200 Handle<String> name, 1205 Handle<String> name,
1201 Label* miss) { 1206 Label* miss) {
1202 // Check that the receiver isn't a smi. 1207 // Check that the receiver isn't a smi.
1203 __ JumpIfSmi(receiver, miss); 1208 __ JumpIfSmi(receiver, miss);
1204 1209
1205 // Check that the maps haven't changed. 1210 // Check that the maps haven't changed.
1206 Register reg = CheckPrototypes( 1211 Register reg = CheckPrototypes(
1207 object, receiver, holder, scratch1, scratch2, scratch3, name, miss); 1212 object, receiver, holder, scratch1, scratch2, scratch3, name, miss);
1208 GenerateFastPropertyLoad(masm(), r0, reg, holder, index); 1213 GenerateFastPropertyLoad(masm(), r0, reg, holder, index);
1209 __ Ret(); 1214 __ Ret();
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
1422 scratch3, 1427 scratch3,
1423 name, 1428 name,
1424 miss); 1429 miss);
1425 } 1430 }
1426 1431
1427 if (lookup->IsField()) { 1432 if (lookup->IsField()) {
1428 // We found FIELD property in prototype chain of interceptor's holder. 1433 // We found FIELD property in prototype chain of interceptor's holder.
1429 // Retrieve a field from field's holder. 1434 // Retrieve a field from field's holder.
1430 GenerateFastPropertyLoad(masm(), r0, holder_reg, 1435 GenerateFastPropertyLoad(masm(), r0, holder_reg,
1431 Handle<JSObject>(lookup->holder()), 1436 Handle<JSObject>(lookup->holder()),
1432 lookup->GetFieldIndex()); 1437 lookup->GetFieldIndex().FieldIndex());
1433 __ Ret(); 1438 __ Ret();
1434 } else { 1439 } else {
1435 // We found CALLBACKS property in prototype chain of interceptor's 1440 // We found CALLBACKS property in prototype chain of interceptor's
1436 // holder. 1441 // holder.
1437 ASSERT(lookup->type() == CALLBACKS); 1442 ASSERT(lookup->type() == CALLBACKS);
1438 Handle<AccessorInfo> callback( 1443 Handle<AccessorInfo> callback(
1439 AccessorInfo::cast(lookup->GetCallbackObject())); 1444 AccessorInfo::cast(lookup->GetCallbackObject()));
1440 ASSERT(callback->getter() != NULL); 1445 ASSERT(callback->getter() != NULL);
1441 1446
1442 // Tail call to runtime. 1447 // Tail call to runtime.
(...skipping 3339 matching lines...) Expand 10 before | Expand all | Expand 10 after
4782 __ Jump(ic_slow, RelocInfo::CODE_TARGET); 4787 __ Jump(ic_slow, RelocInfo::CODE_TARGET);
4783 } 4788 }
4784 } 4789 }
4785 4790
4786 4791
4787 #undef __ 4792 #undef __
4788 4793
4789 } } // namespace v8::internal 4794 } } // namespace v8::internal
4790 4795
4791 #endif // V8_TARGET_ARCH_ARM 4796 #endif // V8_TARGET_ARCH_ARM
OLDNEW
« no previous file with comments | « no previous file | src/bootstrapper.cc » ('j') | src/property.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698