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

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

UserProc::SetParamsAndReturnTypeメソッドをリファクタリング
LexicalAnalysis.hのインクルードを除去した

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