C语言的强大(C语言实现异常机制)
一直知道C很强大,可以编写操作系统等等,但是一直没有概念
今天看了一下KVM的CLDC1.1的源代码,太酷了,一切都是C,加载class,运行class,类多态实现…..加载JAR,运行JAR….实现线程…..还包括实现了异常机制,好强大!
下载地址: j2megame.cn下载
一切的一切,继续学习…..距离….
虽然看不懂,但记录一下实现的,看代码
global.h (异常的实现)
/*
* There must not be any allocation guard active when entering a TRY block
* as an exception throw will always cause at least one allocation (for the
* exception object) thus potentially invalidating any pointers being
* guarded by the allocation guard. Note however that this does not preclude
* using an allocation guard inside a TRY block.
*/
#define ASSERT_NO_ALLOCATION_GUARD \
if (NoAllocation > 0) { \
fatalError(KVM_MSG_TRY_BLOCK_ENTERED_WHEN_ALLOCATION_FORBIDDEN); \
}
#else
#define TRACE_EXCEPTION(name)
#define ASSERT_NO_ALLOCATION_GUARD
#endif
#define TRY \
{ \
struct throwableScopeStruct __scope__; \
int __state__; \
jmp_buf __env__; \
__scope__.outer = ThrowableScope; \
ThrowableScope = &__scope__; \
ThrowableScope->env = &__env__; \
ThrowableScope->tmpRootsCount = TemporaryRootsLength; \
ASSERT_NO_ALLOCATION_GUARD \
TRACE_EXCEPTION("TRY") \
if ((__state__ = setjmp(__env__)) == 0) {
/*
* Any non-null THROWABLE_INSTANCE passed into a CATCH clause
* is protected as a temporary root.
*/
#define CATCH(__throwable__) \
} \
TRACE_EXCEPTION("CATCH") \
ThrowableScope = __scope__.outer; \
TemporaryRootsLength = __scope__.tmpRootsCount; \
if (__state__ != 0) { \
START_TEMPORARY_ROOTS \
DECLARE_TEMPORARY_ROOT(THROWABLE_INSTANCE, \
__throwable__,__scope__.throwable);
#define END_CATCH \
END_TEMPORARY_ROOTS \
} \
}
/*
* This macro is required for jumping out of a CATCH block with a goto.
* This is used in FastInterpret so that the interpreter loop is re-entered
* with a fresh TRY statement.
*/
#define END_CATCH_AND_GOTO(label) \
END_TEMPORARY_ROOTS \
goto label; \
} \
}
#define THROW(__throwable__) \
{ \
THROWABLE_INSTANCE __t__ = __throwable__; \
TRACE_EXCEPTION("THROW") \
if (__t__ == NULL) \
fatalVMError("THROW called with NULL"); \
ThrowableScope->throwable = __t__; \
longjmp(*((jmp_buf*)ThrowableScope->env),1); \
}
class.c (异常的使用)
/*===========================================
* FUNCTION: initializeClass()
* TYPE: constructor
* OVERVIEW: After loading a class, it must be initialized
* by executing the possible internal static
* constructor '<clinit>'. This will initialize the
* necessary static structures.
*
* This function sets up the necessary Class.runClinit
* frame and returns to the interpreter.
* INTERFACE:
* parameters: class pointer
* returns: <nothing>
*===========================================*/
void initializeClass(INSTANCE_CLASS thisClass)
{
if (thisClass->status == CLASS_ERROR) {
raiseException(NoClassDefFoundError);
} else if (thisClass->status < CLASS_READY) {
if (thisClass->status < CLASS_VERIFIED) {
verifyClass(thisClass);
}
/*
* VerifyError will have been thrown or status will be
* CLASS_VERIFIED. We can skip execution of <clinit> altogether if
* it does not exists AND the superclass is already initialised.
*/
if ((thisClass->superClass == NULL ||
thisClass->superClass->status == CLASS_READY) &&
getSpecialMethod(thisClass,clinitNameAndType) == NULL) {
setClassStatus(thisClass,CLASS_READY);
}
else {
TRY {
pushFrame(RunCustomCodeMethod);
pushStackAsType(CustomCodeCallbackFunction, &runClinit);
pushStackAsType(INSTANCE_CLASS, thisClass);
pushStackAsType(long, 1);
} CATCH (e) {
/* Stack overflow */
setClassStatus(thisClass, CLASS_ERROR);
THROW(e);
} END_CATCH
}
}
}
Trackback from your site.