source: dev/trunk/abdev/BasicCompiler32/Compile_Statement.cpp@ 381

Last change on this file since 381 was 381, checked in by dai_9181, 16 years ago

Foreach文のパラメータをInで区切るようにした。

File size: 32.7 KB
RevLine 
[206]1#include "stdafx.h"
2
[183]3#include <jenga/include/smoothie/LexicalAnalysis.h>
4
[248]5#include <LexicalScope.h>
[183]6#include <Compiler.h>
7
[3]8#include "../BasicCompiler_Common/common.h"
9#include "Opcode.h"
10
[129]11void OpcodeOthers( const char *Command ){
[3]12 int i,i2;
13
[122]14 char leftTerm[8192];
15 int lastParePos = 0;
[3]16 for(i=0;;i++){
[122]17 if(Command[i]=='\"'){
18 //ダブルクォートは不正なのでエラー扱い
19 leftTerm[i]=0;
20 SetError(3,leftTerm,cp);
21 return;
22 }
23
24 if(Command[i]=='('){
25 lastParePos = i;
26 i2=GetStringInPare(leftTerm+i,Command+i);
[3]27 i+=i2-1;
28 continue;
29 }
[122]30 if(Command[i]=='['){
31 i2=GetStringInBracket(leftTerm+i,Command+i);
32 i+=i2-1;
[3]33 continue;
34 }
[122]35 if(Command[i]=='\0'){
36 leftTerm[i] = 0;
[3]37 break;
38 }
[122]39
40 if( IsNumCalcMark( Command, i ) ){
41 leftTerm[i] = 0;
42 break;
43 }
44
45 leftTerm[i]=Command[i];
[3]46 }
47 if(!(
[122]48 IsVariableTopChar(leftTerm[0])||
49 leftTerm[0]=='.'||
50 (leftTerm[0]==1&&leftTerm[1]==ESC_PSMEM)
[3]51 )){
52 SetError(1,NULL,cp);
53 return;
54 }
55
56
[122]57 if(Command[i]=='\0' && lastParePos == 0){
[3]58 //////////////////////////////
59 // パラメータ無しのマクロ検索
60 //////////////////////////////
61
[206]62 const UserProc *pUserProc = GetSubHash(Command);
[3]63
64 //GetSubHash内でエラー提示が行われた場合
[75]65 if(pUserProc==(UserProc *)-1) return;
[3]66
[75]67 if(pUserProc==0){
[3]68 char temporary[VN_SIZE];
69 lstrcpy(temporary,Command);
70
71 CharUpper(temporary);
[75]72 pUserProc=GetSubHash(temporary);
[3]73
74 //GetSubHash内でエラー提示が行われた場合
[75]75 if(pUserProc==(UserProc *)-1) return;
[3]76 }
77
[75]78 if(pUserProc){
[122]79 if( !pUserProc->IsMacro() ){
80 SetError(10,Command,cp);
81 }
[3]82
[290]83 Opcode_CallProc("",pUserProc,0,"");
[3]84
85 return;
86 }
87 }
88 else if(IsNumCalcMark(Command,i)){
89 //代入演算
90 OpcodeCalc(Command);
91 return;
92 }
93
[122]94 Type resultType;
95 bool isLiteral;
96 BOOL bUseHeap;
[128]97 bool result = TermOpe( leftTerm, Type(), resultType, isLiteral, &bUseHeap, false, NULL, true );
[122]98 if( result ){
[3]99
100 /////////////////////
101 // 戻り値の処理
102 /////////////////////
103
[76]104 if( resultType.IsReal() ){
[3]105 //fstp st(0)
[236]106 compiler.codeGenerator.PutOld(
107 (char)0xDD,
108 (char)0xD8
109 );
[3]110 }
[76]111 else if( resultType.IsStruct() ){
[51]112 //mov ebx,eax
[225]113 compiler.codeGenerator.op_mov_RR(REG_EBX,REG_EAX);
[3]114
[76]115 FreeTempObject(REG_EBX,&resultType.GetClass());
[3]116 }
117 }
118}
119
120void OpcodeIf(char *Parameter){
[241]121 int i,i2;
[76]122 Type tempType;
[3]123
124 for(i=0;;i++){
125 if(Parameter[i]=='\0'){
126 SetError(21,NULL,cp);
127 return;
128 }
129 if(Parameter[i]==1&&Parameter[i+1]==ESC_THEN){
130 Parameter[i]=0;
131 break;
132 }
133 }
134
[248]135 const PertialSchedule *pIfPertialSchedule = NULL;
[326]136 if( !NumOpe(Parameter,Type(DEF_BOOLEAN),tempType) ){
[3]137 //NumOpe内でエラー
138 }
[76]139 else if( tempType.IsDouble() ){
[3]140 //fld qword ptr[esp]
[225]141 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
[3]142
143 //push 0
[225]144 compiler.codeGenerator.op_push_V(0);
[3]145
146 //fild dword ptr[esp]
[225]147 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
[3]148
149 //add esp,sizeof(double)+sizeof(long)
[225]150 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
[3]151
152 //fcompp
[225]153 compiler.codeGenerator.op_fcompp();
[3]154
155 //fnstsw ax
[225]156 compiler.codeGenerator.op_fnstsw_ax();
[3]157
158 //test ah,40
[225]159 compiler.codeGenerator.op_test_ah( (char)0x40 );
[3]160
161 //jne (endif、または else まで)
[241]162 pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
[3]163 }
[76]164 else if( tempType.IsSingle() ){
[3]165 //fld dword ptr[esp]
[225]166 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
[3]167
168 //push 0
[225]169 compiler.codeGenerator.op_push_V(0);
[3]170
171 //fild dword ptr[esp]
[225]172 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
[3]173
174 //add esp,sizeof(float)+sizeof(long)
[225]175 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
[3]176
177 //fcompp
[225]178 compiler.codeGenerator.op_fcompp();
[3]179
180 //fnstsw ax
[225]181 compiler.codeGenerator.op_fnstsw_ax();
[3]182
183 //test ah,40
[225]184 compiler.codeGenerator.op_test_ah( (char)0x40 );
[3]185
186 //jne (endif、または else まで)
[241]187 pIfPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
[3]188 }
[76]189 else if( tempType.Is64() ){
[3]190 //64ビット型
191
192 //pop eax
[225]193 compiler.codeGenerator.op_pop(REG_EAX);
[3]194
195 //pop ebx
[225]196 compiler.codeGenerator.op_pop(REG_EBX);
[3]197
198 //cmp eax,0
[236]199 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
[3]200
201 //jne
[248]202 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]203
204 //cmp ebx,0
[236]205 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
[3]206
207 //jne
[248]208 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]209
210 //jmp (endif、または else までジャンプ)
[241]211 pIfPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
[3]212
[241]213 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
214 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
[3]215 }
216 else{
217 //32ビット型
218
219 //pop eax
[225]220 compiler.codeGenerator.op_pop(REG_EAX);
[3]221
222 //cmp eax,0
[236]223 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
[3]224
225 //je (endif、または else まで条件ジャンプ)
[241]226 pIfPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
[3]227 }
228
229
230 /////////////////////////
231 // If内をコード化
232 /////////////////////////
233
234 //レキシカルスコープをレベルアップ
[276]235 compiler.codeGenerator.lexicalScopes.Start(
236 compiler.codeGenerator.GetNativeCodeSize(),
237 LexicalScope::SCOPE_TYPE_IF
238 );
[3]239
240 i2=CompileBuffer(ESC_ENDIF,0);
241
242 //レキシカルスコープをレベルダウン
[248]243 compiler.codeGenerator.lexicalScopes.End();
[3]244
245
[241]246 if( pIfPertialSchedule == NULL ) return;
[3]247
248 if(i2==ESC_ELSE){
249 //jmp (endifまで)
[248]250 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
[3]251
[241]252 compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
[3]253
254
255 /////////////////////////
256 // Else内をコード化
257 /////////////////////////
258
259 //レキシカルスコープをレベルアップ
[276]260 compiler.codeGenerator.lexicalScopes.Start(
261 compiler.codeGenerator.GetNativeCodeSize(),
262 LexicalScope::SCOPE_TYPE_IF
263 );
[3]264
265 CompileBuffer(ESC_ENDIF,0);
266
267 //レキシカルスコープをレベルダウン
[248]268 compiler.codeGenerator.lexicalScopes.End();
[3]269
270
[241]271 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
[3]272 }
273 else{
[241]274 compiler.codeGenerator.opfix_JmpPertialSchedule( pIfPertialSchedule );
[3]275 }
276}
277
278int GetLabelAddress(char *LabelName,int LineNum){
279 if(LabelName){
[261]280 BOOST_FOREACH( const GotoLabel &label, compiler.codeGenerator.gotoLabels )
[260]281 {
282 if( label.name.size() > 0 )
283 {
284 if( label.name == LabelName )
285 {
286 return label.address;
287 }
[3]288 }
289 }
290 }
291 else{
[261]292 BOOST_FOREACH( const GotoLabel &label, compiler.codeGenerator.gotoLabels )
[260]293 {
294 if( label.name.size() == 0 )
295 {
296 if( label.line == LineNum )
297 {
298 return label.address;
299 }
[3]300 }
301 }
302 }
303 return -1;
304}
305void OpcodeGoto(char *Parameter){
306 extern HANDLE hHeap;
307 int i,LineNum;
308
309 if(Parameter[0]=='*'){
310 i=GetLabelAddress(Parameter+1,0);
311
[246]312 if( i == -1 )
313 {
314 //jmp ...(schedule)
[253]315 compiler.codeGenerator.op_jmp_goto_schedule( (const std::string)(Parameter + 1), 0, cp );
[3]316 }
[246]317 else
318 {
319 //jmp ...
[276]320 compiler.codeGenerator.op_jmp(
321 i-compiler.codeGenerator.GetNativeCodeSize(),
322 sizeof(long),
323 false,
324 true
325 );
[246]326 }
[3]327 }
328 else{
329 LineNum=atoi(Parameter);
330 i=GetLabelAddress(0,LineNum);
331
[246]332 if( i == -1 )
333 {
334 //jmp ...(schedule)
[253]335 compiler.codeGenerator.op_jmp_goto_schedule( "", LineNum, cp );
[3]336 }
[246]337 else
338 {
339 //jmp ...
[276]340 compiler.codeGenerator.op_jmp(
341 i-compiler.codeGenerator.GetNativeCodeSize(),
342 sizeof(long),
343 false,
344 true
345 );
[246]346 }
[3]347 }
348}
349void OpcodeWhile(char *Parameter){
350 extern HANDLE hHeap;
351
352 //Continueアドレスのバックアップとセット
[241]353 compiler.codeGenerator.ContinueAreaBegin();
[3]354
355 if(!Parameter[0]) SetError(10,"While",cp);
356
[248]357 const PertialSchedule *pWhilePertialSchedule = NULL;
[76]358 Type tempType;
359 if( !NumOpe(Parameter,Type(),tempType) ){
360 //ダミー
361 }
362 else if( tempType.IsDouble() ){
[3]363 //fld qword ptr[esp]
[225]364 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
[3]365
366 //push 0
[225]367 compiler.codeGenerator.op_push_V(0);
[3]368
369 //fild dword ptr[esp]
[225]370 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
[3]371
372 //add esp,sizeof(double)+sizeof(long)
[225]373 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
[3]374
375 //fcompp
[225]376 compiler.codeGenerator.op_fcompp();
[3]377
378 //fnstsw ax
[225]379 compiler.codeGenerator.op_fnstsw_ax();
[3]380
381 //test ah,40
[225]382 compiler.codeGenerator.op_test_ah( (char)0x40 );
[3]383
384 //jne (Wend まで)
[241]385 pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
[3]386 }
[76]387 else if( tempType.IsSingle() ){
[3]388 //fld dword ptr[esp]
[225]389 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
[3]390
391 //push 0
[225]392 compiler.codeGenerator.op_push_V(0);
[3]393
394 //fild dword ptr[esp]
[225]395 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
[3]396
397 //add esp,sizeof(float)+sizeof(long)
[225]398 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
[3]399
400 //fcompp
[225]401 compiler.codeGenerator.op_fcompp();
[3]402
403 //fnstsw ax
[225]404 compiler.codeGenerator.op_fnstsw_ax();
[3]405
[241]406 //test ah,40h
[225]407 compiler.codeGenerator.op_test_ah( (char)0x40 );
[3]408
409 //jne (Wend まで)
[241]410 pWhilePertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(long), true );
[3]411 }
[76]412 else if( tempType.Is64() ){
[3]413 //64ビット型
414
415 //pop eax
[225]416 compiler.codeGenerator.op_pop(REG_EAX);
[3]417
418 //pop ebx
[225]419 compiler.codeGenerator.op_pop(REG_EBX);
[3]420
421 //cmp eax,0
[236]422 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
[3]423
424 //jne
[248]425 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]426
427 //cmp ebx,0
[236]428 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
[3]429
430 //jne
[248]431 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]432
[241]433 //jmp (Wendまでジャンプ)
434 pWhilePertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
[3]435
[241]436 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
437 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
[3]438 }
439 else{
440 //その他整数型
441
442 //pop eax
[225]443 compiler.codeGenerator.op_pop(REG_EAX);
[3]444
445 //cmp eax,0
[236]446 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
[3]447
448 //je (Wend まで)
[241]449 pWhilePertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
[3]450 }
451
452 //レキシカルスコープをレベルアップ
[276]453 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_WHILE );
[3]454
455 //While内をコンパイル
456 CompileBuffer(0,COM_WEND);
457
[248]458 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
[3]459
460 //jmp ...
[241]461 compiler.codeGenerator.op_jmp_continue();
[3]462
463 //レキシカルスコープをレベルダウン
[248]464 compiler.codeGenerator.lexicalScopes.End();
[3]465
[241]466 if( pWhilePertialSchedule )
467 {
468 compiler.codeGenerator.opfix_JmpPertialSchedule( pWhilePertialSchedule );
469 }
[3]470
[241]471 compiler.codeGenerator.ContinueAreaEnd();
[3]472}
473
474char szNextVariable[VN_SIZE];
475void OpcodeFor(char *Parameter){
476 extern HANDLE hHeap;
[241]477 int i,i2;
[3]478 char temporary[VN_SIZE],variable[VN_SIZE],JudgeNum[VN_SIZE],StepNum[VN_SIZE];
479
480 //第1パラメータを取得
481 i=GetOneParameter(Parameter,0,temporary);
482 if(!Parameter[i]){
483 SetError(12,"For",cp);
484 goto ErrorStep;
485 }
486
487 for(i2=0;;i2++){
488 if(temporary[i2]=='='){
489 variable[i2]=0;
490
491 //カウンタ初期化
492 OpcodeCalc(temporary);
493 break;
494 }
495 if(temporary[i2]=='\0'){
496 SetError(12,"For",cp);
497 goto ErrorStep;
498 }
499 variable[i2]=temporary[i2];
500 }
501
502 //jmp ...
[248]503 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
[3]504
505 //Continueアドレスのバックアップとセット
[241]506 compiler.codeGenerator.ContinueAreaBegin();
[3]507
508 //第2パラメータを取得(to~)
509 i=GetOneParameter(Parameter,i,JudgeNum);
510
511 //第3パラメータを取得(step~)
512 if(Parameter[i]){
513 i=GetOneParameter(Parameter,i,StepNum);
514 if(Parameter[i]) SetError(12,"For",cp);
515 }
516 else lstrcpy(StepNum,"1");
517
518 //カウンタを増加させる
519 sprintf(temporary,"%s=(%s)+(%s)",variable,variable,StepNum);
520 OpcodeCalc(temporary);
521
[241]522 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
[3]523
524 //増加か減少かを区別する
525 sprintf(temporary,"(%s)>=0",StepNum);
[76]526 NumOpe(temporary,Type(),Type());
[3]527
528 //pop eax
[225]529 compiler.codeGenerator.op_pop(REG_EAX);
[3]530
531 //cmp eax,0
[236]532 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
[3]533
534 //je [カウンタ減少の場合の判定]
[241]535 pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
[3]536
537 //判定(カウンタ増加の場合)
538 sprintf(temporary,"%s<=(%s)",variable,JudgeNum);
[76]539 NumOpe(temporary,Type(),Type());
[3]540
541 //pop eax
[225]542 compiler.codeGenerator.op_pop(REG_EAX);
[3]543
544 //jmp [カウンタ減少の場合の判定を飛び越す]
[248]545 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
[3]546
[241]547 //jeジャンプ先のオフセット値
548 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
[3]549
550 //判定(カウンタ減少の場合)
551 sprintf(temporary,"%s>=(%s)",variable,JudgeNum);
[76]552 NumOpe(temporary,Type(),Type());
[3]553
554 //pop eax
[225]555 compiler.codeGenerator.op_pop(REG_EAX);
[3]556
[241]557 //jmpジャンプ先のオフセット値
558 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
[3]559
560 //cmp eax,0
[236]561 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
[3]562
563ErrorStep:
564
565 //je ...
[241]566 pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
[3]567
568 //レキシカルスコープをレベルアップ
[276]569 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
[3]570
571 //For内をコンパイル
572 CompileBuffer(0,COM_NEXT);
573
[248]574 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
[3]575
576 if(szNextVariable[0]){
577 if(lstrcmp(szNextVariable,variable)!=0){
578 SetError(55,szNextVariable,cp);
579 }
580 }
581
582 //jmp ...
[241]583 compiler.codeGenerator.op_jmp_continue();
[3]584
585 //レキシカルスコープをレベルダウン
[248]586 compiler.codeGenerator.lexicalScopes.End();
[3]587
[241]588 //jeジャンプ先のオフセット値
589 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
[3]590
591 //Continueアドレスを復元
[241]592 compiler.codeGenerator.ContinueAreaEnd();
[3]593}
594
[372]595void OpcodeForeach( const char *Parameter )
596{
597 Type resultType;
[381]598 char temporary[VN_SIZE],variable[VN_SIZE],collectionVar[VN_SIZE];
[372]599 bool isError = false;
600
[381]601 //レキシカルスコープをレベルアップ
602 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_FOR );
603
[372]604 //第1パラメータを取得
[381]605 int i = 0;
606 GetCustomToken( variable, Parameter, i, ESC_IN, true );
[372]607 if(!Parameter[i]){
608 SetError(12,"Foreach",cp);
609 isError = true;
610 goto ErrorStep;
611 }
[381]612 i++;
[372]613
614 //第2パラメータを取得(in~)
[381]615 lstrcpy( collectionVar, Parameter + i );
[374]616
[373]617 if( !GetVarType( variable, resultType, false ) )
618 {
619 Type collectionType;
[374]620 if( !NumOpe_GetType( collectionVar, Type(), collectionType ) )
[373]621 {
622 isError = true;
623 goto ErrorStep;
624 }
[372]625
[373]626 // 未定義の場合は自動的に定義する
[374]627 sprintf(temporary,"%s%c%c%s", variable, 1, ESC_AS, collectionType.GetActualGenericType(0).GetClass().GetFullName().c_str() );
[373]628 OpcodeDim(temporary,DIMFLAG_INITDEBUGVAR);
629 }
630
[372]631 // Resetメソッドを呼び出す
632 sprintf( temporary, "%s.Reset()", collectionVar );
633 Compile( temporary );
634
635 //Continueアドレスのバックアップとセット
636 compiler.codeGenerator.ContinueAreaBegin();
637
638 // MoveNextメソッドを呼び出す
639 sprintf( temporary, "%s.MoveNext()", collectionVar );
640 NumOpe(temporary,Type(),Type());
641
642 //pop eax
643 compiler.codeGenerator.op_pop(REG_EAX);
644
645 //cmp eax,0
646 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
647
648ErrorStep:
649
650 //je ...
651 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(long), true );
652
[381]653 if( !isError )
654 {
655 // Currentプロパティから現在の値を取得
656 sprintf( temporary, "%s=%s.Current", variable, collectionVar );
657 Compile( temporary );
658 }
[372]659
660 //For内をコンパイル
661 CompileBuffer(0,COM_NEXT);
662
663 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
664
665 if(szNextVariable[0]){
666 if(lstrcmp(szNextVariable,variable)!=0){
667 SetError(55,szNextVariable,cp);
668 }
669 }
670
[381]671 if( !isError )
672 {
673 //jmp ...
674 compiler.codeGenerator.op_jmp_continue();
675 }
[372]676
677 //レキシカルスコープをレベルダウン
678 compiler.codeGenerator.lexicalScopes.End();
679
680 //jeジャンプ先のオフセット値
681 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
682
683 //Continueアドレスを復元
684 compiler.codeGenerator.ContinueAreaEnd();
685}
686
[3]687void OpcodeDo(char *Parameter){
688 extern HANDLE hHeap;
[247]689 int i,i2,i3;
[3]690
691 if(Parameter[0]) SetError(10,"Do",cp);
692
693 //Continueアドレスのバックアップとセット
[241]694 compiler.codeGenerator.ContinueAreaBegin();
[3]695
696 //レキシカルスコープをレベルアップ
[276]697 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_DO );
[3]698
699 //Do内をコンパイル
700 CompileBuffer(0,COM_LOOP);
701
[248]702 compiler.codeGenerator.lexicalScopes.CallDestructorsOfScopeEnd();
[3]703
[248]704 const PertialSchedule *pDoPertialSchedule = NULL;
[241]705
[3]706 extern char *basbuf;
707 char temporary[VN_SIZE];
708 for(i=cp-1;;i--){
709 if(IsCommandDelimitation(basbuf[i])){
710 i+=3;
711 if(!(basbuf[i]=='0'||basbuf[i]=='1')){
712 //無条件ループ
713 break;
714 }
715 i3=i;
716
717 for(i+=2,i2=0;;i++,i2++){
718 if(IsCommandDelimitation(basbuf[i])){
719 temporary[i2]=0;
720 break;
721 }
722 temporary[i2]=basbuf[i];
723 }
724
[76]725 Type tempType;
726 NumOpe(temporary,Type(),tempType);
[3]727
[76]728 if( tempType.IsDouble() ){
[3]729 //fld qword ptr[esp]
[225]730 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
[3]731
732 //push 0
[225]733 compiler.codeGenerator.op_push_V(0);
[3]734
735 //fild dword ptr[esp]
[225]736 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
[3]737
738 //add esp,sizeof(double)+sizeof(long)
[225]739 compiler.codeGenerator.op_add_esp(sizeof(double)+sizeof(long));
[3]740
741 //fcompp
[225]742 compiler.codeGenerator.op_fcompp();
[3]743
744 //fnstsw ax
[225]745 compiler.codeGenerator.op_fnstsw_ax();
[3]746
747 //test ah,40
[225]748 compiler.codeGenerator.op_test_ah( (char)0x40 );
[3]749
750 if(basbuf[i3]=='0'){
751 //While
752
753 //jne 5(ループ終了)
[241]754 pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]755 }
756 else if(basbuf[i3]=='1'){
757 //Until
758
759 //je 5(ループ終了)
[241]760 pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
[3]761 }
762 }
[76]763 else if( tempType.IsSingle() ){
[3]764 //fld dword ptr[esp]
[225]765 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
[3]766
767 //push 0
[225]768 compiler.codeGenerator.op_push_V(0);
[3]769
770 //fild dword ptr[esp]
[225]771 compiler.codeGenerator.op_fld_ptr_esp(DEF_LONG);
[3]772
773 //add esp,sizeof(float)+sizeof(long)
[225]774 compiler.codeGenerator.op_add_esp(sizeof(float)+sizeof(long));
[3]775
776 //fcompp
[225]777 compiler.codeGenerator.op_fcompp();
[3]778
779 //fnstsw ax
[225]780 compiler.codeGenerator.op_fnstsw_ax();
[3]781
782 //test ah,40
[225]783 compiler.codeGenerator.op_test_ah( (char)0x40 );
[3]784
785 if(basbuf[i3]=='0'){
786 //While
787
788 //jne 5(ループ終了)
[241]789 pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]790 }
791 else if(basbuf[i3]=='1'){
792 //Until
793
794 //je 5(ループ終了)
[241]795 pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
[3]796 }
797 }
[76]798 else if( tempType.Is64() ){
[3]799 //64ビット型
800
801 //pop eax
[225]802 compiler.codeGenerator.op_pop(REG_EAX);
[3]803
804 //pop ebx
[225]805 compiler.codeGenerator.op_pop(REG_EBX);
[3]806
807 //cmp eax,0
[236]808 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
[3]809
810 //jne
[248]811 const PertialSchedule *pTempPertialSchedule1 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]812
813 //cmp ebx,0
[236]814 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EBX, 0 );
[3]815
816 //jne
[248]817 const PertialSchedule *pTempPertialSchedule2 = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]818
819 if(basbuf[i3]=='0'){
820 //While
821
822 //jmp 5(ループ終了)
[241]823 pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
[3]824
[247]825 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
826 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
[3]827 }
828 else if(basbuf[i3]=='1'){
829 //Until
830
831 //jmp 2(ループを続ける)
[248]832 const PertialSchedule *pTempPertialSchedule3 = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
[3]833
[247]834 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule1 );
835 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule2 );
[3]836
837 //jmp 5(ループ終了)
[241]838 pDoPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(char), true );
[247]839
840 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule3 );
[3]841 }
842 }
843 else{
844 //pop eax
[225]845 compiler.codeGenerator.op_pop(REG_EAX);
[3]846
847 //cmp eax,0
[236]848 compiler.codeGenerator.op_cmp_value( sizeof(long), REG_EAX, 0 );
[3]849
850 if(basbuf[i3]=='0'){
851 //While
852
853 //je 5(ループ終了)
[241]854 pDoPertialSchedule = compiler.codeGenerator.op_je( 0, sizeof(char), true );
[3]855 }
856 else if(basbuf[i3]=='1'){
857 //Until
858
859 //jne 5(ループ終了)
[241]860 pDoPertialSchedule = compiler.codeGenerator.op_jne( 0, sizeof(char), true );
[3]861 }
862 }
863 break;
864 }
865 }
866
867 //jmp ...
[241]868 compiler.codeGenerator.op_jmp_continue();
[3]869
[241]870 if( pDoPertialSchedule )
871 {
872 compiler.codeGenerator.opfix_JmpPertialSchedule( pDoPertialSchedule );
873 }
874
[3]875 //jmp ...
[248]876 const PertialSchedule *pTempPertialSchedule = compiler.codeGenerator.op_jmp( 0, sizeof(long), true );
[3]877
878 //レキシカルスコープをレベルダウン
[248]879 compiler.codeGenerator.lexicalScopes.End();
[3]880
[243]881 //jmpジャンプ先のオフセット値
882 compiler.codeGenerator.opfix_JmpPertialSchedule( pTempPertialSchedule );
[3]883
884 //Continueアドレスを復元
[241]885 compiler.codeGenerator.ContinueAreaEnd();
[3]886}
887void OpcodeContinue(void){
888 //jmp ...(Continue addr)
[241]889 compiler.codeGenerator.op_jmp_continue();
[3]890}
891
892void OpcodeExitSub(void){
[76]893 if( UserProc::IsGlobalAreaCompiling() ){
[3]894 SetError(12,"Exit Sub/Function",cp);
895 return;
896 }
897
[34]898 //未解放のローカルオブジェクトのデストラクタを呼び出す
[248]899 compiler.codeGenerator.lexicalScopes.CallDestructorsOfReturn();
[34]900
[3]901 //jmp ...(End Sub/Function)
[247]902 compiler.codeGenerator.op_jmp_exitsub();
[3]903}
904
[250]905//Caseスケジュール
906class SelectSchedule
907{
908public:
909 SelectSchedule( int typeSize )
910 : typeSize( typeSize )
911 , nowCaseSchedule( 0 )
912 {
913 }
[3]914
[250]915 PertialSchedules casePertialSchedules;
916 int typeSize;
917 int nowCaseSchedule;
918};
919std::vector<SelectSchedule> selectSchedules;
[3]920
[76]921void OpcodeSelect(const char *lpszParms){
[3]922 extern HANDLE hHeap;
923 extern char *basbuf;
[76]924 int i,i2,i3,sw,NowCaseCp;
[3]925 char temporary[VN_SIZE];
[250]926
[76]927 Type type1;
928 if( !NumOpe(lpszParms,Type(), type1 ) ){
929 return;
[3]930 }
931
[250]932 selectSchedules.push_back( SelectSchedule( type1.GetSize() ) );
933
934 if( selectSchedules.back().typeSize < sizeof(long) ){
935 selectSchedules.back().typeSize = sizeof(long);
[76]936 }
937
[3]938 for(i=cp,sw=0;;i++){
939 if(basbuf[i]=='\0'){
[250]940 selectSchedules.pop_back();
[3]941 SetError(22,"Select",cp);
942 return;
943 }
944 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE){
945 for(i2=0;;i++){
946 if(basbuf[i]==1&&basbuf[i+1]==ESC_SELECTCASE) i2++;
947 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
948 i2--;
949 if(i2==0) break;
950 }
951 }
952 continue;
953 }
954 if(basbuf[i]==1&&basbuf[i+1]==ESC_ENDSELECT){
955 if(sw==0){
956 //add esp,CaseTypeSize
[250]957 compiler.codeGenerator.op_add_esp( selectSchedules.back().typeSize );
[3]958 }
959 break;
960 }
961 if(basbuf[i]==1&&basbuf[i+1]==ESC_CASE){
962 NowCaseCp=i;
963
964 i++;
965 while(1){
966 for(i++,i2=0;;i++,i2++){
967 if(basbuf[i]=='\"'){
968 i3=GetStringInQuotation(temporary+i2,basbuf+i);
969 i+=i3-1;
970 i2+=i3-1;
971 continue;
972 }
973 if(basbuf[i]=='('){
974 i3=GetStringInPare(temporary+i2,basbuf+i);
975 i+=i3-1;
976 i2+=i3-1;
977 continue;
978 }
979 if(basbuf[i]=='['){
980 i3=GetStringInBracket(temporary+i2,basbuf+i);
981 i+=i3-1;
982 i2+=i3-1;
983 continue;
984 }
985
986 if(IsCommandDelimitation(basbuf[i])){
987 temporary[i2]=0;
988 break;
989 }
990 if(basbuf[i]==','){
991 temporary[i2]=0;
992 break;
993 }
994
995 temporary[i2]=basbuf[i];
996 }
997
998 //エラー用
999 i2=cp;
1000 cp=NowCaseCp;
1001
[76]1002 Type type2;
1003 if( !NumOpe(temporary,type1,type2) ){
1004 return;
1005 }
[3]1006
1007 cp=i2;
1008
[76]1009 if(type1.IsObject()){
[206]1010 std::vector<const UserProc *> subs;
[342]1011 type1.GetClass().GetDynamicMethods().Enum( CALC_EQUAL, subs );
[50]1012 if( subs.size() == 0 ){
[3]1013 return;
1014 }
1015
[75]1016 Parameters params;
[76]1017 params.push_back( new Parameter( "", Type( type2 ) ) );
[3]1018
1019 //オーバーロードを解決
[206]1020 const UserProc *pUserProc = OverloadSolution("==",subs, params, NULL);
[3]1021
[75]1022 delete params[0];
1023
1024 if(!pUserProc){
[3]1025 //エラー
1026 return;
1027 }
1028
1029
1030 //pop edx
[225]1031 compiler.codeGenerator.op_pop(REG_EDX);
[3]1032
1033 //mov ecx,dword ptr[esp]
[225]1034 compiler.codeGenerator.op_mov_RM(sizeof(long),REG_ECX,REG_ESP,0,MOD_BASE);
[3]1035
1036 //push edx
[225]1037 compiler.codeGenerator.op_push(REG_EDX);
[3]1038
1039 //push ecx
[225]1040 compiler.codeGenerator.op_push(REG_ECX);
[3]1041
1042 //call operator_proc ※ ==演算子
[225]1043 compiler.codeGenerator.op_call(pUserProc);
[3]1044
1045 //test eax,eax
[225]1046 compiler.codeGenerator.op_test(REG_EAX,REG_EAX);
[3]1047
1048 //jne ...
[250]1049 selectSchedules.back().casePertialSchedules.push_back(
1050 compiler.codeGenerator.op_jne( 0, sizeof(long), true )
1051 );
[3]1052 }
[76]1053 else if(type1.IsDouble()){
1054 ChangeTypeToDouble(type2.GetBasicType());
[3]1055
1056 //fld qword ptr[esp]
[225]1057 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
[3]1058
1059 //add esp,CaseTypeSize
[250]1060 compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
[3]1061
1062 //fld qword ptr[esp]
[225]1063 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
[3]1064
1065 //fcompp
[225]1066 compiler.codeGenerator.op_fcompp();
[3]1067
1068 //fnstsw ax
[225]1069 compiler.codeGenerator.op_fnstsw_ax();
[3]1070
1071 //test ah,40
[225]1072 compiler.codeGenerator.op_test_ah( (char)0x40 );
[3]1073
1074 //jne ...
[250]1075 selectSchedules.back().casePertialSchedules.push_back(
1076 compiler.codeGenerator.op_jne( 0, sizeof(long), true )
1077 );
[3]1078 }
[76]1079 else if(type1.IsSingle()){
1080 ChangeTypeToSingle(type2.GetBasicType());
[3]1081
1082 //fld dword ptr[esp]
[225]1083 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
[3]1084
1085 //add esp,CaseTypeSize
[250]1086 compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
[3]1087
1088 //fld dword ptr[esp]
[225]1089 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
[3]1090
1091 //fcompp
[225]1092 compiler.codeGenerator.op_fcompp();
[3]1093
1094 //fnstsw ax
[225]1095 compiler.codeGenerator.op_fnstsw_ax();
[3]1096
1097 //test ah,40
[225]1098 compiler.codeGenerator.op_test_ah( (char)0x40 );
[3]1099
1100 //jne ...
[250]1101 selectSchedules.back().casePertialSchedules.push_back(
1102 compiler.codeGenerator.op_jne( 0, sizeof(long), true )
1103 );
[3]1104 }
1105 else{
1106 //その他整数型
1107
1108 //pop ebx
[225]1109 compiler.codeGenerator.op_pop(REG_EBX);
[3]1110
1111 //mov eax,dword ptr[esp]
[236]1112 compiler.codeGenerator.op_mov_RM( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
[3]1113
1114 //cmp eax,ebx
[227]1115 compiler.codeGenerator.op_cmp_RR( REG_EAX, REG_EBX );
[3]1116
1117 //je ...
[250]1118 selectSchedules.back().casePertialSchedules.push_back(
1119 compiler.codeGenerator.op_je( 0, sizeof(long), true )
1120 );
[3]1121 }
1122
1123 if(basbuf[i]!=',') break;
1124 }
1125 }
1126 if(basbuf[i]==1&&basbuf[i+1]==ESC_CASEELSE){
1127 sw=1;
1128
1129 //jmp ...
[250]1130 selectSchedules.back().casePertialSchedules.push_back(
1131 compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
1132 );
[3]1133 }
1134 }
1135
1136 //レキシカルスコープをレベルアップ
[276]1137 compiler.codeGenerator.lexicalScopes.Start( compiler.codeGenerator.GetNativeCodeSize(), LexicalScope::SCOPE_TYPE_SELECT );
[3]1138
1139 //Select Case内をコンパイル
1140 CompileBuffer(ESC_ENDSELECT,0);
1141
1142 //jmp EndSelect
[250]1143 selectSchedules.back().casePertialSchedules.push_back(
1144 compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
1145 );
[3]1146
1147 //最終スケジュール
[250]1148 for(i=selectSchedules.back().nowCaseSchedule;i<(int)selectSchedules.back().casePertialSchedules.size();i++){
1149 compiler.codeGenerator.opfix_JmpPertialSchedule( selectSchedules.back().casePertialSchedules[i] );
[3]1150 }
1151
1152 //レキシカルスコープをレベルダウン
[248]1153 compiler.codeGenerator.lexicalScopes.End();
[3]1154
[250]1155 selectSchedules.pop_back();
[3]1156}
1157void OpcodeCase(char *Parameter){
1158 int i;
1159
[250]1160 if(selectSchedules.back().typeSize==-1){
[3]1161 SetError(30,"Case",cp);
1162 return;
1163 }
1164
1165 //jmp EndSelect
[250]1166 selectSchedules.back().casePertialSchedules.push_back(
1167 compiler.codeGenerator.op_jmp( 0, sizeof(long), true )
1168 );
[3]1169
1170 i=0;
1171 while(1){
1172 //Caseスケジュール
[250]1173 compiler.codeGenerator.opfix_JmpPertialSchedule( selectSchedules.back().casePertialSchedules[selectSchedules.back().nowCaseSchedule] );
1174 selectSchedules.back().nowCaseSchedule++;
[3]1175
1176 i=JumpOneParameter(Parameter,i);
1177 if(Parameter[i]=='\0') break;
1178 }
1179
1180 //add esp,CaseTypeSize
[250]1181 compiler.codeGenerator.op_add_esp(selectSchedules.back().typeSize);
[3]1182}
1183
1184void OpcodeGosub(char *Parameter){
1185 extern HANDLE hHeap;
1186 int i,LineNum;
1187
1188 if(Parameter[0]=='*'){
1189 i=GetLabelAddress(Parameter+1,0);
1190
[246]1191 if( i == -1 )
1192 {
1193 //jmp ...(schedule)
[253]1194 compiler.codeGenerator.op_jmp_goto_schedule( (const std::string)(Parameter + 1), 0, cp );
[3]1195 }
[246]1196 else
1197 {
1198 //jmp ...
[276]1199 compiler.codeGenerator.op_jmp(
1200 i-compiler.codeGenerator.GetNativeCodeSize(),
1201 sizeof(long),
1202 false,
1203 true
1204 );
[246]1205 }
[3]1206 }
1207 else{
1208 LineNum=atoi(Parameter);
1209 i=GetLabelAddress(0,LineNum);
1210
[246]1211 if( i == -1 )
1212 {
1213 //jmp ...(schedule)
[253]1214 compiler.codeGenerator.op_jmp_goto_schedule( "", LineNum, cp );
[3]1215 }
[246]1216 else
1217 {
1218 //jmp ...
[276]1219 compiler.codeGenerator.op_jmp(
1220 i-compiler.codeGenerator.GetNativeCodeSize(),
1221 sizeof(long),
1222 false,
1223 true
1224 );
[246]1225 }
[3]1226 }
1227}
1228void OpcodeReturn(char *Parameter){
[76]1229 if( UserProc::IsGlobalAreaCompiling() ){
[3]1230 //Gosub~Returnとして扱う
1231
1232 //ret
[225]1233 compiler.codeGenerator.op_ret();
[3]1234 }
1235 else{
1236 //戻り値をセット
1237 if(Parameter[0]){
[206]1238 const UserProc &proc = UserProc::CompilingUserProc();
[76]1239
[75]1240 const char *temp = "_System_ReturnValue";
[76]1241 if(proc.GetName()[0]==1&&proc.GetName()[1]==ESC_OPERATOR)
[75]1242 {
1243 }
[76]1244 else{
1245 temp=proc.GetName().c_str();
1246 }
[3]1247
[75]1248 char temporary[VN_SIZE];
1249 sprintf(temporary,"%s=%s",temp,Parameter);
1250 OpcodeCalc(temporary);
[3]1251 }
1252
1253 //プロシージャを抜け出す(C言語のreturnと同様の処理を行う)
1254 OpcodeExitSub();
1255 }
1256}
1257
1258
1259////////////
1260// ポインタ
1261
1262void OpcodeSetPtrData(char *Parameter,int type){
[76]1263 int i;
[3]1264 char temporary[VN_SIZE];
1265
1266 if(Parameter[0]=='('){
1267 i=JumpStringInPare(Parameter,1);
1268 if(Parameter[i+1]=='\0'){
1269 for(i=0;;i++){
1270 Parameter[i]=Parameter[i+1];
1271 if(Parameter[i]=='\0') break;
1272 }
1273 Parameter[i-1]=0;
1274 }
1275 }
1276
1277 //第1パラメータを取得
1278 i=GetOneParameter(Parameter,0,temporary);
1279 if(!Parameter[i]){
1280 SetError(1,NULL,cp);
1281 return;
1282 }
1283
[76]1284 Type resultType;
1285 if( !NumOpe(temporary,Type(),resultType) ){
1286 return;
1287 }
1288 if(!resultType.IsWhole()){
1289 SetError(11,Parameter,cp);
1290 return;
1291 }
[3]1292
[76]1293 ChangeTypeToLong( resultType.GetBasicType() );
1294
[3]1295 //第2パラメータを取得
1296 i=GetOneParameter(Parameter,i,temporary);
1297 if(Parameter[i]){
1298 SetError(1,NULL,cp);
1299 return;
1300 }
1301
[76]1302 if( !NumOpe(temporary,Type(),resultType) ){
1303 return;
1304 }
1305
[3]1306 if(type==DEF_DOUBLE){
[76]1307 ChangeTypeToDouble_ToFpuReg( resultType.GetBasicType() );
[3]1308
1309 //pop eax
[225]1310 compiler.codeGenerator.op_pop(REG_EAX);
[3]1311
1312 //fstp qword ptr[eax]
[236]1313 compiler.codeGenerator.PutOld(
1314 (char)0xDD,
1315 (char)0x18
1316 );
[3]1317 }
1318 else if(type==DEF_SINGLE){
[76]1319 ChangeTypeToSingle( resultType.GetBasicType() );
[3]1320
1321 //pop ebx
[225]1322 compiler.codeGenerator.op_pop(REG_EBX);
[3]1323
1324 //pop eax
[225]1325 compiler.codeGenerator.op_pop(REG_EAX);
[3]1326
1327 //mov dword ptr[eax],ebx
[225]1328 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
[3]1329 }
1330 else if(type==DEF_QWORD){
[76]1331 ChangeTypeToInt64( resultType.GetBasicType() );
[3]1332
1333 //pop ecx
[225]1334 compiler.codeGenerator.op_pop(REG_ECX);
[3]1335
1336 //pop ebx
[225]1337 compiler.codeGenerator.op_pop(REG_EBX);
[3]1338
1339 //pop eax
[225]1340 compiler.codeGenerator.op_pop(REG_EAX);
[3]1341
1342 //mov dword ptr[eax],ecx
[225]1343 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_ECX, REG_EAX, 0, MOD_BASE );
[3]1344
1345 //mov dword ptr[eax+sizeof(long)],ebx
[225]1346 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0x04, MOD_BASE_DISP8 );
[3]1347 }
1348 else if(type==DEF_DWORD){
[76]1349 ChangeTypeToLong( resultType.GetBasicType() );
[3]1350
1351 //pop ebx
[225]1352 compiler.codeGenerator.op_pop(REG_EBX);
[3]1353
1354 //pop eax
[225]1355 compiler.codeGenerator.op_pop(REG_EAX);
[3]1356
1357 //mov dword ptr[eax],ebx
[225]1358 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EBX, REG_EAX, 0, MOD_BASE );
[3]1359 }
1360 else if(type==DEF_WORD){
[76]1361 ChangeTypeToLong( resultType.GetBasicType() );
[3]1362
1363 //pop ebx
[225]1364 compiler.codeGenerator.op_pop(REG_EBX);
[3]1365
1366 //pop eax
[225]1367 compiler.codeGenerator.op_pop(REG_EAX);
[3]1368
1369 //mov word ptr[eax],bx
[236]1370 compiler.codeGenerator.op_mov_MR( sizeof(short), REG_EBX, REG_EAX, 0, MOD_BASE );
[3]1371 }
1372 else if(type==DEF_BYTE){
[76]1373 ChangeTypeToLong( resultType.GetBasicType() );
[3]1374
1375 //pop ebx
[225]1376 compiler.codeGenerator.op_pop(REG_EBX);
[3]1377
1378 //pop eax
[225]1379 compiler.codeGenerator.op_pop(REG_EAX);
[3]1380
1381 //mov byte ptr[eax],bl
[236]1382 compiler.codeGenerator.op_mov_MR( sizeof(char), REG_EBX, REG_EAX, 0, MOD_BASE );
[3]1383 }
1384}
Note: See TracBrowser for help on using the repository browser.