Ignore:
Timestamp:
May 15, 2007, 2:44:41 AM (17 years ago)
Author:
dai
Message:

[32bitコンパイラ]ByRef指定のInteger/Byte型のローカル変数に値を代入すると強制終了してしまうバグを修正。
(呼び出し単体コードも対応→)関数の戻り値オブジェクトのメンバ・メソッドを一時オブジェクトを介さずに参照できるようにした。
オブジェクトの先頭バッファのサイズを4ポインタ分に拡張した。

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Include/system/exception.ab

    r237 r249  
    55    Const AddressOfCatch As VoidPtr
    66    Const StackPtr As LONG_PTR
     7    context As CONTEXT
     8    Const debugProcNum As DWord
    79   
    810    Sub TryLayer( AddressOfCatch As VoidPtr, StackPtr As LONG_PTR )
    911        This.AddressOfCatch = AddressOfCatch
    1012        This.StackPtr = StackPtr
     13
     14        context.ContextFlags=CONTEXT_ALL
     15        If Thread.CurrentThread().__GetContext(context) = 0 Then
     16            ' TODO: エラー処理
     17            debug
     18        End If
     19
     20#ifdef _DEBUG
     21        Dim ThreadNum As Long
     22        ThreadNum=_DebugSys_GetThread()
     23        If ThreadNum <> -1 Then
     24            debugProcNum = _DebugSys_ProcNum[ThreadNum]
     25        End If
     26#endif
    1127    End Sub
    1228    Sub ~TryLayer()
     
    3753
    3854    'Try
    39     Sub BeginTryScope( AddressOfCatch As VoidPtr, StackPtr As LONG_PTR )
     55    Function BeginTryScope( AddressOfCatch As VoidPtr, StackPtr As LONG_PTR ) As TryLayer
    4056        ppTryLayers = _System_realloc( ppTryLayers, ( nTryLayers + 1 ) * SizeOf( *TryLayer ) )
    4157        ppTryLayers[nTryLayers] = New TryLayer( AddressOfCatch, StackPtr )
    4258        nTryLayers++
    43     End Sub
     59
     60        Return ByVal ppTryLayers[nTryLayers-1]
     61    End Function
    4462
    4563    'End Try
     
    5573
    5674            'TODO: 適切なエラー処理
     75            MessageBox( NULL, "例外", "", MB_OK or MB_ICONEXCLAMATION )
    5776
    5877            Return
     
    7291
    7392        'レジスタ情報を取得
    74         Dim context As CONTEXT
    75         FillMemory(VarPtr(context),SizeOf(CONTEXT),0)
    76         context.ContextFlags=CONTEXT_CONTROL
    77         If thread.__GetContext( context ) = 0 Then
    78             OutputDebugString(Ex"レジスタ情報の取得に失敗しました。\r\n")
    79             Return
    80         End If
    81 
     93        Dim context = ppTryLayers[nTryLayers - 1]->context
     94debug
    8295        '新しいip, spをセット
    8396#ifdef _WIN64
    8497        context.Rip = ppTryLayers[nTryLayers - 1]->AddressOfCatch As QWord
    85         context.Rsp = ppTryLayers[nTryLayers - 1]->StackPtr
     98        'context.Rsp = ppTryLayers[nTryLayers - 1]->StackPtr
    8699#else
    87100        context.Eip = ppTryLayers[nTryLayers - 1]->AddressOfCatch As DWord
    88101        context.Esp = ppTryLayers[nTryLayers - 1]->StackPtr
    89102#endif
     103
     104#ifdef _DEBUG
     105        Dim ThreadNum As Long
     106        ThreadNum=_DebugSys_GetThread()
     107        If ThreadNum <> -1 Then
     108            _DebugSys_ProcNum[ThreadNum] = ppTryLayers[nTryLayers - 1]->debugProcNum-1
     109        End If
     110#endif
     111
    90112        If thread.__SetContext( context ) = 0 Then
    91113            OutputDebugString(Ex"レジスタ情報の設定に失敗しました。\r\n")
Note: See TracChangeset for help on using the changeset viewer.