kernel/eka/euser/epoc/win32/uc_trp.cpp
changeset 0 a41df078684a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/kernel/eka/euser/epoc/win32/uc_trp.cpp	Mon Oct 19 15:55:17 2009 +0100
@@ -0,0 +1,102 @@
+// Copyright (c) 1995-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of the License "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32\euser\epoc\win32\uc_trp.cpp
+// 
+//
+
+#include <u32exec.h>
+#include <e32panic.h>
+#include "uc_std.h"
+
+GLREF_C void Panic(TCdtPanic);
+
+#ifndef __LEAVE_EQUALS_THROW__
+
+// __thiscall - parameter is expected to be removed by this function
+EXPORT_C TInt TTrap::Trap(TInt &aResult)
+//
+// Save the enter frame state and return 0.
+//
+	{
+	// compiler generates push ebp; mov ebp,esp here
+	// hence correct action for Leave() is to restore ebp then mov esp,ebp; pop ebp; ret 4
+	aResult=KErrNone;
+	iResult=(&aResult);
+	_asm mov eax, this
+	_asm mov [eax], ebx
+	_asm mov [eax+4], esi
+	_asm mov [eax+8], edi
+	_asm mov [eax+12], ebp
+	_asm mov [eax+16], ds
+	_asm mov [eax+20], es
+	_asm mov [eax+24], fs
+	_asm mov [eax+28], gs
+	_asm mov edx, [ebp]
+	_asm mov [eax+32], edx
+	_asm mov edx, [ebp+4]
+	_asm mov [eax+36], edx
+	TTrapHandler* h = Exec::PushTrapFrame(this);
+	if (h != NULL)
+		h->Trap();
+	return(0);
+	}
+
+
+
+// __cdecl - this function will leave parameter on the stack
+// but it will return to the instruction after the call to TTrap::Trap()
+// and this expects a parameter to be popped from the stack
+// so we must return with a ret 4, rather than leaving the compiler to generate a ret 0
+EXPORT_C void User::Leave(TInt aReason)
+/**
+Leaves the currently executing function, unwinds the call stack, and returns
+from the most recently entered trap harness.
+
+@param aReason The value returned from the most recent call to TRAP or TRAPD.
+               This is known as the reason code and, typically, it gives the
+               reason for the environment or user error causing this leave
+               to occur.
+              
+@see TRAP
+@see TRAPD              
+*/
+	{
+
+	TTrap *pT=Exec::PopTrapFrame();
+    if (!pT)
+        ::Panic(EUserLeaveWithoutTrap);
+	TTrapHandler *pH=pT->iHandler;
+	*pT->iResult=aReason;
+	if (pH!=NULL)
+		pH->Leave(aReason);
+	_asm mov eax, pT
+	_asm mov ebp, [eax+12]
+	_asm mov esp, ebp
+	_asm mov ebx, [eax]
+	_asm mov esi, [eax+4]
+	_asm mov edi, [eax+8]
+	_asm mov ds, [eax+16]
+	_asm mov es, [eax+20]
+	_asm mov fs, [eax+24]
+	_asm mov gs, [eax+28]
+	_asm mov edx, [eax+32]
+	_asm mov [ebp], edx
+	_asm mov edx, [eax+36]
+	_asm mov [ebp+4], edx
+	_asm mov eax, 1
+	_asm pop ebp
+	_asm ret 4
+	}
+
+#endif // !__LEAVE_EQUALS_THROW__