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

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

Issue 1327002: Simplify passing of AccessorInfo to interceptors: (Closed)
Patch Set: . Created 10 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
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 __ mov(dst, FieldOperand(dst, offset)); 269 __ mov(dst, FieldOperand(dst, offset));
270 } 270 }
271 } 271 }
272 272
273 273
274 static void PushInterceptorArguments(MacroAssembler* masm, 274 static void PushInterceptorArguments(MacroAssembler* masm,
275 Register receiver, 275 Register receiver,
276 Register holder, 276 Register holder,
277 Register name, 277 Register name,
278 JSObject* holder_obj) { 278 JSObject* holder_obj) {
279 __ push(receiver);
280 __ push(holder);
281 __ push(name); 279 __ push(name);
282 InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor(); 280 InterceptorInfo* interceptor = holder_obj->GetNamedInterceptor();
283 ASSERT(!Heap::InNewSpace(interceptor)); 281 ASSERT(!Heap::InNewSpace(interceptor));
284 __ mov(receiver, Immediate(Handle<Object>(interceptor))); 282 Register scratch = name;
283 __ mov(scratch, Immediate(Handle<Object>(interceptor)));
284 __ push(scratch);
285 __ push(receiver); 285 __ push(receiver);
286 __ push(FieldOperand(receiver, InterceptorInfo::kDataOffset)); 286 __ push(holder);
287 __ push(FieldOperand(scratch, InterceptorInfo::kDataOffset));
287 } 288 }
288 289
289 290
290 static void CompileCallLoadPropertyWithInterceptor(MacroAssembler* masm, 291 static void CompileCallLoadPropertyWithInterceptor(MacroAssembler* masm,
291 Register receiver, 292 Register receiver,
292 Register holder, 293 Register holder,
293 Register name, 294 Register name,
294 JSObject* holder_obj) { 295 JSObject* holder_obj) {
295 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); 296 PushInterceptorArguments(masm, receiver, holder, name, holder_obj);
296 __ CallExternalReference( 297 __ CallExternalReference(
(...skipping 735 matching lines...) Expand 10 before | Expand all | Expand 10 after
1032 Register reg = 1033 Register reg =
1033 CheckPrototypes(object, receiver, holder, 1034 CheckPrototypes(object, receiver, holder,
1034 scratch1, scratch2, name, miss); 1035 scratch1, scratch2, name, miss);
1035 1036
1036 Handle<AccessorInfo> callback_handle(callback); 1037 Handle<AccessorInfo> callback_handle(callback);
1037 1038
1038 Register other = reg.is(scratch1) ? scratch2 : scratch1; 1039 Register other = reg.is(scratch1) ? scratch2 : scratch1;
1039 __ EnterInternalFrame(); 1040 __ EnterInternalFrame();
1040 __ PushHandleScope(other); 1041 __ PushHandleScope(other);
1041 // Push the stack address where the list of arguments ends 1042 // Push the stack address where the list of arguments ends
1042 __ mov(other, esp); 1043 __ mov(other, esp);
antonm 2010/03/25 14:40:53 Do we need to push the address?
Vitaly Repeshko 2010/03/25 17:08:56 Yes, please see below. It's internal::Object** fro
1043 __ sub(Operand(other), Immediate(2 * kPointerSize)); 1044 __ sub(Operand(other), Immediate(2 * kPointerSize));
1044 __ push(other); 1045 __ push(other);
1045 __ push(receiver); // receiver 1046 __ push(receiver); // receiver
1046 __ push(reg); // holder 1047 __ push(reg); // holder
1047 __ mov(other, Immediate(callback_handle)); 1048 __ mov(other, Immediate(callback_handle));
1048 __ push(other);
1049 __ push(FieldOperand(other, AccessorInfo::kDataOffset)); // data 1049 __ push(FieldOperand(other, AccessorInfo::kDataOffset)); // data
1050 __ push(name_reg); // name 1050 __ push(name_reg); // name
1051 // Save a pointer to where we pushed the arguments pointer. 1051 // Save a pointer to where we pushed the arguments pointer.
1052 // This will be passed as the const Arguments& to the C++ callback. 1052 // This will be passed as the const AccessorInfo& to the C++ callback.
1053 __ mov(eax, esp); 1053 __ mov(eax, esp);
1054 __ add(Operand(eax), Immediate(5 * kPointerSize)); 1054 __ add(Operand(eax), Immediate(4 * kPointerSize));
antonm 2010/03/25 14:40:53 could we use some named constant for this 4?
Vitaly Repeshko 2010/03/25 17:08:56 This is a local thing: it's the depth of the argum
1055 __ mov(ebx, esp); 1055 __ mov(ebx, esp);
1056 1056
1057 // Do call through the api. 1057 // Do call through the api.
1058 ASSERT_EQ(6, ApiGetterEntryStub::kStackSpace); 1058 ASSERT_EQ(5, ApiGetterEntryStub::kStackSpace);
antonm 2010/03/25 14:40:53 do you I understand it right, this is not ported t
Vitaly Repeshko 2010/03/25 17:08:56 Right, this is not ported to other platforms and I
1059 Address getter_address = v8::ToCData<Address>(callback->getter()); 1059 Address getter_address = v8::ToCData<Address>(callback->getter());
1060 ApiFunction fun(getter_address); 1060 ApiFunction fun(getter_address);
1061 ApiGetterEntryStub stub(callback_handle, &fun); 1061 ApiGetterEntryStub stub(callback_handle, &fun);
1062 // Emitting a stub call may try to allocate (if the code is not 1062 // Emitting a stub call may try to allocate (if the code is not
1063 // already generated). Do not allow the assembler to perform a 1063 // already generated). Do not allow the assembler to perform a
1064 // garbage collection but instead return the allocation failure 1064 // garbage collection but instead return the allocation failure
1065 // object. 1065 // object.
1066 Object* result = masm()->TryCallStub(&stub); 1066 Object* result = masm()->TryCallStub(&stub);
1067 if (result->IsFailure()) { 1067 if (result->IsFailure()) {
1068 *failure = Failure::cast(result); 1068 *failure = Failure::cast(result);
(...skipping 1355 matching lines...) Expand 10 before | Expand all | Expand 10 after
2424 __ jmp(generic_construct_stub, RelocInfo::CODE_TARGET); 2424 __ jmp(generic_construct_stub, RelocInfo::CODE_TARGET);
2425 2425
2426 // Return the generated code. 2426 // Return the generated code.
2427 return GetCode(); 2427 return GetCode();
2428 } 2428 }
2429 2429
2430 2430
2431 #undef __ 2431 #undef __
2432 2432
2433 } } // namespace v8::internal 2433 } } // namespace v8::internal
OLDNEW
« src/arguments.h ('K') | « src/handles.cc ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698