OLD | NEW |
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 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
369 } | 369 } |
370 | 370 |
371 | 371 |
372 // Load a fast property out of a holder object (src). In-object properties | 372 // Load a fast property out of a holder object (src). In-object properties |
373 // are loaded directly otherwise the property is loaded from the properties | 373 // are loaded directly otherwise the property is loaded from the properties |
374 // fixed array. | 374 // fixed array. |
375 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm, | 375 void StubCompiler::GenerateFastPropertyLoad(MacroAssembler* masm, |
376 Register dst, | 376 Register dst, |
377 Register src, | 377 Register src, |
378 Handle<JSObject> holder, | 378 Handle<JSObject> holder, |
379 int index) { | 379 PropertyIndex index) { |
380 // Adjust for the number of properties stored in the holder. | 380 if (index.IsHeaderIndex()) { |
381 index -= holder->map()->inobject_properties(); | 381 int offset = index.HeaderIndex() * kPointerSize; |
382 if (index < 0) { | |
383 // Get the property straight out of the holder. | |
384 int offset = holder->map()->instance_size() + (index * kPointerSize); | |
385 __ mov(dst, FieldOperand(src, offset)); | 382 __ mov(dst, FieldOperand(src, offset)); |
386 } else { | 383 } else { |
387 // Calculate the offset into the properties array. | 384 // Adjust for the number of properties stored in the holder. |
388 int offset = index * kPointerSize + FixedArray::kHeaderSize; | 385 int slot = index.FieldIndex() - holder->map()->inobject_properties(); |
389 __ mov(dst, FieldOperand(src, JSObject::kPropertiesOffset)); | 386 if (slot < 0) { |
390 __ mov(dst, FieldOperand(dst, offset)); | 387 // Get the property straight out of the holder. |
| 388 int offset = holder->map()->instance_size() + (slot * kPointerSize); |
| 389 __ mov(dst, FieldOperand(src, offset)); |
| 390 } else { |
| 391 // Calculate the offset into the properties array. |
| 392 int offset = slot * kPointerSize + FixedArray::kHeaderSize; |
| 393 __ mov(dst, FieldOperand(src, JSObject::kPropertiesOffset)); |
| 394 __ mov(dst, FieldOperand(dst, offset)); |
| 395 } |
391 } | 396 } |
392 } | 397 } |
393 | 398 |
394 | 399 |
395 static void PushInterceptorArguments(MacroAssembler* masm, | 400 static void PushInterceptorArguments(MacroAssembler* masm, |
396 Register receiver, | 401 Register receiver, |
397 Register holder, | 402 Register holder, |
398 Register name, | 403 Register name, |
399 Handle<JSObject> holder_obj) { | 404 Handle<JSObject> holder_obj) { |
400 __ push(name); | 405 __ push(name); |
(...skipping 628 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1029 return reg; | 1034 return reg; |
1030 } | 1035 } |
1031 | 1036 |
1032 | 1037 |
1033 void StubCompiler::GenerateLoadField(Handle<JSObject> object, | 1038 void StubCompiler::GenerateLoadField(Handle<JSObject> object, |
1034 Handle<JSObject> holder, | 1039 Handle<JSObject> holder, |
1035 Register receiver, | 1040 Register receiver, |
1036 Register scratch1, | 1041 Register scratch1, |
1037 Register scratch2, | 1042 Register scratch2, |
1038 Register scratch3, | 1043 Register scratch3, |
1039 int index, | 1044 PropertyIndex index, |
1040 Handle<String> name, | 1045 Handle<String> name, |
1041 Label* miss) { | 1046 Label* miss) { |
1042 // Check that the receiver isn't a smi. | 1047 // Check that the receiver isn't a smi. |
1043 __ JumpIfSmi(receiver, miss); | 1048 __ JumpIfSmi(receiver, miss); |
1044 | 1049 |
1045 // Check the prototype chain. | 1050 // Check the prototype chain. |
1046 Register reg = CheckPrototypes( | 1051 Register reg = CheckPrototypes( |
1047 object, receiver, holder, scratch1, scratch2, scratch3, name, miss); | 1052 object, receiver, holder, scratch1, scratch2, scratch3, name, miss); |
1048 | 1053 |
1049 // Get the value from the properties. | 1054 // Get the value from the properties. |
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1416 Handle<Code> code = | 1421 Handle<Code> code = |
1417 isolate()->stub_cache()->ComputeCallMiss(arguments().immediate(), | 1422 isolate()->stub_cache()->ComputeCallMiss(arguments().immediate(), |
1418 kind_, | 1423 kind_, |
1419 extra_state_); | 1424 extra_state_); |
1420 __ jmp(code, RelocInfo::CODE_TARGET); | 1425 __ jmp(code, RelocInfo::CODE_TARGET); |
1421 } | 1426 } |
1422 | 1427 |
1423 | 1428 |
1424 Handle<Code> CallStubCompiler::CompileCallField(Handle<JSObject> object, | 1429 Handle<Code> CallStubCompiler::CompileCallField(Handle<JSObject> object, |
1425 Handle<JSObject> holder, | 1430 Handle<JSObject> holder, |
1426 int index, | 1431 PropertyIndex index, |
1427 Handle<String> name) { | 1432 Handle<String> name) { |
1428 // ----------- S t a t e ------------- | 1433 // ----------- S t a t e ------------- |
1429 // -- ecx : name | 1434 // -- ecx : name |
1430 // -- esp[0] : return address | 1435 // -- esp[0] : return address |
1431 // -- esp[(argc - n) * 4] : arg[n] (zero-based) | 1436 // -- esp[(argc - n) * 4] : arg[n] (zero-based) |
1432 // -- ... | 1437 // -- ... |
1433 // -- esp[(argc + 1) * 4] : receiver | 1438 // -- esp[(argc + 1) * 4] : receiver |
1434 // ----------------------------------- | 1439 // ----------------------------------- |
1435 Label miss; | 1440 Label miss; |
1436 | 1441 |
(...skipping 1512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2949 __ bind(&miss); | 2954 __ bind(&miss); |
2950 GenerateLoadMiss(masm(), Code::LOAD_IC); | 2955 GenerateLoadMiss(masm(), Code::LOAD_IC); |
2951 | 2956 |
2952 // Return the generated code. | 2957 // Return the generated code. |
2953 return GetCode(Code::NONEXISTENT, factory()->empty_string()); | 2958 return GetCode(Code::NONEXISTENT, factory()->empty_string()); |
2954 } | 2959 } |
2955 | 2960 |
2956 | 2961 |
2957 Handle<Code> LoadStubCompiler::CompileLoadField(Handle<JSObject> object, | 2962 Handle<Code> LoadStubCompiler::CompileLoadField(Handle<JSObject> object, |
2958 Handle<JSObject> holder, | 2963 Handle<JSObject> holder, |
2959 int index, | 2964 PropertyIndex index, |
2960 Handle<String> name) { | 2965 Handle<String> name) { |
2961 // ----------- S t a t e ------------- | 2966 // ----------- S t a t e ------------- |
2962 // -- ecx : name | 2967 // -- ecx : name |
2963 // -- edx : receiver | 2968 // -- edx : receiver |
2964 // -- esp[0] : return address | 2969 // -- esp[0] : return address |
2965 // ----------------------------------- | 2970 // ----------------------------------- |
2966 Label miss; | 2971 Label miss; |
2967 | 2972 |
2968 GenerateLoadField(object, holder, edx, ebx, eax, edi, index, name, &miss); | 2973 GenerateLoadField(object, holder, edx, ebx, eax, edi, index, name, &miss); |
2969 __ bind(&miss); | 2974 __ bind(&miss); |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3149 GenerateLoadMiss(masm(), Code::LOAD_IC); | 3154 GenerateLoadMiss(masm(), Code::LOAD_IC); |
3150 | 3155 |
3151 // Return the generated code. | 3156 // Return the generated code. |
3152 return GetCode(Code::NORMAL, name); | 3157 return GetCode(Code::NORMAL, name); |
3153 } | 3158 } |
3154 | 3159 |
3155 | 3160 |
3156 Handle<Code> KeyedLoadStubCompiler::CompileLoadField(Handle<String> name, | 3161 Handle<Code> KeyedLoadStubCompiler::CompileLoadField(Handle<String> name, |
3157 Handle<JSObject> receiver, | 3162 Handle<JSObject> receiver, |
3158 Handle<JSObject> holder, | 3163 Handle<JSObject> holder, |
3159 int index) { | 3164 PropertyIndex index) { |
3160 // ----------- S t a t e ------------- | 3165 // ----------- S t a t e ------------- |
3161 // -- ecx : key | 3166 // -- ecx : key |
3162 // -- edx : receiver | 3167 // -- edx : receiver |
3163 // -- esp[0] : return address | 3168 // -- esp[0] : return address |
3164 // ----------------------------------- | 3169 // ----------------------------------- |
3165 Label miss; | 3170 Label miss; |
3166 | 3171 |
3167 Counters* counters = isolate()->counters(); | 3172 Counters* counters = isolate()->counters(); |
3168 __ IncrementCounter(counters->keyed_load_field(), 1); | 3173 __ IncrementCounter(counters->keyed_load_field(), 1); |
3169 | 3174 |
(...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4357 __ jmp(ic_slow, RelocInfo::CODE_TARGET); | 4362 __ jmp(ic_slow, RelocInfo::CODE_TARGET); |
4358 } | 4363 } |
4359 } | 4364 } |
4360 | 4365 |
4361 | 4366 |
4362 #undef __ | 4367 #undef __ |
4363 | 4368 |
4364 } } // namespace v8::internal | 4369 } } // namespace v8::internal |
4365 | 4370 |
4366 #endif // V8_TARGET_ARCH_IA32 | 4371 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |