Changeset 249


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

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

Files:
6 edited

Legend:

Unmodified
Added
Removed
  • Include/Classes/System/Threading/Thread.ab

    r237 r249  
    4444    End Sub
    4545
    46     Sub Thread(ByRef obj As Thread)
     46    Sub Thread(obj As Thread)
    4747        m_hThread=obj.m_hThread
    4848        m_dwThreadId=obj.m_dwThreadId
     
    151151
    152152    Static Function CurrentThread() As Thread
    153         Dim obj_Thread As Thread()
    154         _System_pobj_AllThreads->CurrentThread(obj_Thread)
    155         Return obj_Thread
     153        Return _System_pobj_AllThreads->CurrentThread()
    156154    End Function
    157155End Class
     
    311309
    312310    'カレントスレッドを取得
    313     Function CurrentThread(ByRef obj_Thread As Thread) As Boolean
     311    Function CurrentThread() As Thread
    314312        Dim dwNowThreadId As DWord
    315313        dwNowThreadId=GetCurrentThreadId()
     
    318316        For i=0 To ELM(ThreadNum)
    319317            If ppobj_Thread[i]->ThreadId=dwNowThreadId Then
    320                 obj_Thread.Thread(ByVal ppobj_Thread[i])
    321                 Return True
    322             End If
    323         Next
    324 
    325         Return False
     318                Return ByVal ppobj_Thread[i]
     319            End If
     320        Next
     321
     322        ' TODO: エラー処理
     323        OutputDebugString( "カレントスレッドの取得に失敗" )
     324        debug
    326325    End Function
    327326
  • 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")
  • Include/system/gc.sbp

    r237 r249  
    288288                    If pdwFlags[index] and _System_GC_FLAG_OBJECT Then
    289289                        ' オブジェクトの場合
    290                         If ScanObject( (ppPtr[index] + 3*SizeOf(LONG_PTR)) As *Object, pbMark) = False Then
     290                        If ScanObject( (ppPtr[index] + 4*SizeOf(LONG_PTR)) As *Object, pbMark) = False Then
    291291                            Dim maxNum = (pSize[index]\SizeOf(LONG_PTR)) As Long
    292292                            Scan(ppPtr[index] As *LONG_PTR, maxNum, pbMark)
     
    371371                        ・オブジェクトのサイズ
    372372                        ・デストラクタの関数ポインタ
     373                        ・リザーブ領域
    373374                        を考慮 */
    374                     _System_SweepingDelete (ptr + SizeOf( LONG_PTR ) * 3 )
     375                    _System_SweepingDelete (ptr + SizeOf( LONG_PTR ) * 4 )
    375376                Else
    376377                    HeapFree(_System_hProcessHeap,0,ptr)
Note: See TracChangeset for help on using the changeset viewer.