| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 4938 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4949 __ bind(&done); | 4949 __ bind(&done); |
| 4950 __ Addu(sp, sp, Operand(3 * kPointerSize)); | 4950 __ Addu(sp, sp, Operand(3 * kPointerSize)); |
| 4951 __ Ret(); | 4951 __ Ret(); |
| 4952 | 4952 |
| 4953 __ bind(&slowcase); | 4953 __ bind(&slowcase); |
| 4954 __ TailCallRuntime(Runtime::kRegExpConstructResult, 3, 1); | 4954 __ TailCallRuntime(Runtime::kRegExpConstructResult, 3, 1); |
| 4955 } | 4955 } |
| 4956 | 4956 |
| 4957 | 4957 |
| 4958 void CallFunctionStub::Generate(MacroAssembler* masm) { | 4958 void CallFunctionStub::Generate(MacroAssembler* masm) { |
| 4959 Label slow; | 4959 Label slow, non_function; |
| 4960 | 4960 |
| 4961 // The receiver might implicitly be the global object. This is | 4961 // The receiver might implicitly be the global object. This is |
| 4962 // indicated by passing the hole as the receiver to the call | 4962 // indicated by passing the hole as the receiver to the call |
| 4963 // function stub. | 4963 // function stub. |
| 4964 if (ReceiverMightBeImplicit()) { | 4964 if (ReceiverMightBeImplicit()) { |
| 4965 Label call; | 4965 Label call; |
| 4966 // Get the receiver from the stack. | 4966 // Get the receiver from the stack. |
| 4967 // function, receiver [, arguments] | 4967 // function, receiver [, arguments] |
| 4968 __ lw(t0, MemOperand(sp, argc_ * kPointerSize)); | 4968 __ lw(t0, MemOperand(sp, argc_ * kPointerSize)); |
| 4969 // Call as function is indicated with the hole. | 4969 // Call as function is indicated with the hole. |
| 4970 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | 4970 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
| 4971 __ Branch(&call, ne, t0, Operand(at)); | 4971 __ Branch(&call, ne, t0, Operand(at)); |
| 4972 // Patch the receiver on the stack with the global receiver object. | 4972 // Patch the receiver on the stack with the global receiver object. |
| 4973 __ lw(a1, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX))); | 4973 __ lw(a1, MemOperand(cp, Context::SlotOffset(Context::GLOBAL_INDEX))); |
| 4974 __ lw(a1, FieldMemOperand(a1, GlobalObject::kGlobalReceiverOffset)); | 4974 __ lw(a1, FieldMemOperand(a1, GlobalObject::kGlobalReceiverOffset)); |
| 4975 __ sw(a1, MemOperand(sp, argc_ * kPointerSize)); | 4975 __ sw(a1, MemOperand(sp, argc_ * kPointerSize)); |
| 4976 __ bind(&call); | 4976 __ bind(&call); |
| 4977 } | 4977 } |
| 4978 | 4978 |
| 4979 // Get the function to call from the stack. | 4979 // Get the function to call from the stack. |
| 4980 // function, receiver [, arguments] | 4980 // function, receiver [, arguments] |
| 4981 __ lw(a1, MemOperand(sp, (argc_ + 1) * kPointerSize)); | 4981 __ lw(a1, MemOperand(sp, (argc_ + 1) * kPointerSize)); |
| 4982 | 4982 |
| 4983 // Check that the function is really a JavaScript function. | 4983 // Check that the function is really a JavaScript function. |
| 4984 // a1: pushed function (to be verified) | 4984 // a1: pushed function (to be verified) |
| 4985 __ JumpIfSmi(a1, &slow); | 4985 __ JumpIfSmi(a1, &non_function); |
| 4986 // Get the map of the function object. | 4986 // Get the map of the function object. |
| 4987 __ GetObjectType(a1, a2, a2); | 4987 __ GetObjectType(a1, a2, a2); |
| 4988 __ Branch(&slow, ne, a2, Operand(JS_FUNCTION_TYPE)); | 4988 __ Branch(&slow, ne, a2, Operand(JS_FUNCTION_TYPE)); |
| 4989 | 4989 |
| 4990 // Fast-case: Invoke the function now. | 4990 // Fast-case: Invoke the function now. |
| 4991 // a1: pushed function | 4991 // a1: pushed function |
| 4992 ParameterCount actual(argc_); | 4992 ParameterCount actual(argc_); |
| 4993 | 4993 |
| 4994 if (ReceiverMightBeImplicit()) { | 4994 if (ReceiverMightBeImplicit()) { |
| 4995 Label call_as_function; | 4995 Label call_as_function; |
| 4996 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); | 4996 __ LoadRoot(at, Heap::kTheHoleValueRootIndex); |
| 4997 __ Branch(&call_as_function, eq, t0, Operand(at)); | 4997 __ Branch(&call_as_function, eq, t0, Operand(at)); |
| 4998 __ InvokeFunction(a1, | 4998 __ InvokeFunction(a1, |
| 4999 actual, | 4999 actual, |
| 5000 JUMP_FUNCTION, | 5000 JUMP_FUNCTION, |
| 5001 NullCallWrapper(), | 5001 NullCallWrapper(), |
| 5002 CALL_AS_METHOD); | 5002 CALL_AS_METHOD); |
| 5003 __ bind(&call_as_function); | 5003 __ bind(&call_as_function); |
| 5004 } | 5004 } |
| 5005 __ InvokeFunction(a1, | 5005 __ InvokeFunction(a1, |
| 5006 actual, | 5006 actual, |
| 5007 JUMP_FUNCTION, | 5007 JUMP_FUNCTION, |
| 5008 NullCallWrapper(), | 5008 NullCallWrapper(), |
| 5009 CALL_AS_FUNCTION); | 5009 CALL_AS_FUNCTION); |
| 5010 | 5010 |
| 5011 // Slow-case: Non-function called. | 5011 // Slow-case: Non-function called. |
| 5012 __ bind(&slow); | 5012 __ bind(&slow); |
| 5013 // Check for function proxy. |
| 5014 __ Branch(&non_function, ne, a2, Operand(JS_FUNCTION_PROXY_TYPE)); |
| 5015 __ push(a1); // Put proxy as additional argument. |
| 5016 __ li(a0, Operand(argc_ + 1, RelocInfo::NONE)); |
| 5017 __ li(a2, Operand(0, RelocInfo::NONE)); |
| 5018 __ GetBuiltinEntry(a3, Builtins::CALL_FUNCTION_PROXY); |
| 5019 __ SetCallKind(t1, CALL_AS_FUNCTION); |
| 5020 { |
| 5021 Handle<Code> adaptor = |
| 5022 masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(); |
| 5023 __ Jump(adaptor, RelocInfo::CODE_TARGET); |
| 5024 } |
| 5025 |
| 5013 // CALL_NON_FUNCTION expects the non-function callee as receiver (instead | 5026 // CALL_NON_FUNCTION expects the non-function callee as receiver (instead |
| 5014 // of the original receiver from the call site). | 5027 // of the original receiver from the call site). |
| 5028 __ bind(&non_function); |
| 5015 __ sw(a1, MemOperand(sp, argc_ * kPointerSize)); | 5029 __ sw(a1, MemOperand(sp, argc_ * kPointerSize)); |
| 5016 __ li(a0, Operand(argc_)); // Setup the number of arguments. | 5030 __ li(a0, Operand(argc_)); // Setup the number of arguments. |
| 5017 __ mov(a2, zero_reg); | 5031 __ mov(a2, zero_reg); |
| 5018 __ GetBuiltinEntry(a3, Builtins::CALL_NON_FUNCTION); | 5032 __ GetBuiltinEntry(a3, Builtins::CALL_NON_FUNCTION); |
| 5019 __ SetCallKind(t1, CALL_AS_METHOD); | 5033 __ SetCallKind(t1, CALL_AS_METHOD); |
| 5020 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), | 5034 __ Jump(masm->isolate()->builtins()->ArgumentsAdaptorTrampoline(), |
| 5021 RelocInfo::CODE_TARGET); | 5035 RelocInfo::CODE_TARGET); |
| 5022 } | 5036 } |
| 5023 | 5037 |
| 5024 | 5038 |
| (...skipping 1982 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7007 __ mov(result, zero_reg); | 7021 __ mov(result, zero_reg); |
| 7008 __ Ret(); | 7022 __ Ret(); |
| 7009 } | 7023 } |
| 7010 | 7024 |
| 7011 | 7025 |
| 7012 #undef __ | 7026 #undef __ |
| 7013 | 7027 |
| 7014 } } // namespace v8::internal | 7028 } } // namespace v8::internal |
| 7015 | 7029 |
| 7016 #endif // V8_TARGET_ARCH_MIPS | 7030 #endif // V8_TARGET_ARCH_MIPS |
| OLD | NEW |