00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 #include "arch.h"
00189 ARCH_COPYRIGHT_APACHE(opcode, c, "$URL: https://svn.apache.org/path/name/opcode.c $ $Id: opcode.c 0 09/28/2005 dlydick $");
00190
00191 #include "jvmcfg.h"
00192 #include "cfmacros.h"
00193 #include "classfile.h"
00194 #include "exit.h"
00195 #include "gc.h"
00196 #include "jvm.h"
00197 #include "jvmclass.h"
00198 #include "linkage.h"
00199 #include "method.h"
00200 #include "native.h"
00201 #include "opcode.h"
00202 #include "utf.h"
00203 #include "util.h"
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232 #define GET_U2_OPERAND(u2var) \
00233 u2var = GETRS2((u2 *) &pcode[pc->offset]); \
00234 pc->offset += sizeof(u2)
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265 #define CHECK_CP_TAG(u2var, cptag1) \
00266 if (cptag1 != CP_TAG(pcfs, u2var)) \
00267 { \
00268 \
00269 thread_throw_exception(thridx, \
00270 THREAD_STATUS_THREW_ERROR, \
00271 JVMCLASS_JAVA_LANG_VERIFYERROR); \
00272 \
00273 }
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 #define CHECK_CP_TAG2(u2var, cptag1, cptag2) \
00300 if ((cptag1 != CP_TAG(pcfs, u2var)) && \
00301 (cptag2 != CP_TAG(pcfs, u2var))) \
00302 { \
00303 \
00304 thread_throw_exception(thridx, \
00305 THREAD_STATUS_THREW_ERROR, \
00306 JVMCLASS_JAVA_LANG_VERIFYERROR); \
00307 \
00308 }
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 #define CHECK_CP_TAG3(u2var, cptag1, cptag2, cptag3) \
00338 if ((cptag1 != CP_TAG(pcfs, u2var)) && \
00339 (cptag2 != CP_TAG(pcfs, u2var)) && \
00340 (cptag3 != CP_TAG(pcfs, u2var))) \
00341 { \
00342 \
00343 thread_throw_exception(thridx, \
00344 THREAD_STATUS_THREW_ERROR, \
00345 JVMCLASS_JAVA_LANG_VERIFYERROR); \
00346 \
00347 }
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 #define FORCE_JINT(var_sizeofjint) \
00389 (*((jint *) ((jvoid *) &var_sizeofjint)))
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417 #define FORCE_JFLOAT(var_sizeofjint) \
00418 (*((jfloat *) ((jvoid *) &var_sizeofjint)))
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434 #define CALCULATE_METHOD_INFO_FROM_PC \
00435 clsidxmisc = GET_PC_FIELD_IMMEDIATE(thridx, clsidx); \
00436 mthidxmisc = GET_PC_FIELD_IMMEDIATE(thridx, mthidx); \
00437 pcfsmisc = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs; \
00438 pmth = METHOD(clsidxmisc, mthidxmisc)
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460 #define CALCULATE_CLASS_INFO_FROM_CLASS_REFERENCE(clsnameidx) \
00461 pcpd = pcfs->constant_pool[clsnameidx]; \
00462 pcpd_Class = PTR_THIS_CP_Class(pcpd); \
00463 clsidxmisc = pcpd_Class->LOCAL_Class_binding.clsidxJVM; \
00464 if (jvm_class_index_null == clsidxmisc) \
00465 { \
00466 \
00467 jvm_constant_pool_index cpidxOLD = clsnameidx; \
00468 \
00469 \
00470 LATE_CLASS_LOAD(cpidxOLD); \
00471 } \
00472 pcfsmisc = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs;
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490 #define LATE_CLASS_LOAD(clsnameidx) \
00491 \
00492 pcpd = pcfs->constant_pool[clsnameidx]; \
00493 pcpd_Class = PTR_THIS_CP_Class(pcpd); \
00494 \
00495 pcpd = pcfs->constant_pool[pcpd_Class->name_index]; \
00496 pcpd_Utf8 = PTR_THIS_CP_Utf8(pcpd); \
00497 \
00498 prchar_clsname = utf_utf2prchar(pcpd_Utf8); \
00499 \
00500 \
00501 clsidxmisc = class_load_resolve_clinit(prchar_clsname, \
00502 CURRENT_THREAD, \
00503 rfalse, \
00504 rfalse); \
00505 \
00506 HEAP_FREE_DATA(prchar_clsname); \
00507 \
00508 \
00509 if (jvm_class_index_null == clsidxmisc) \
00510 { \
00511 thread_throw_exception(thridx, \
00512 THREAD_STATUS_THREW_ERROR, \
00513 JVMCLASS_JAVA_LANG_NOCLASSDEFFOUNDERROR); \
00514 \
00515 }
00516
00517
00518
00519
00520
00521
00522
00523
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543 #define CALCULATE_METHOD_INFO_FROM_METHOD_REFERENCE(Methodref) \
00544 pcpd = pcfs->constant_pool[Methodref]; \
00545 pcpd_Methodref = PTR_THIS_CP_Methodref(pcpd); \
00546 clsidxmisc = pcpd_Methodref->LOCAL_Methodref_binding.clsidxJVM;\
00547 if (jvm_class_index_null == clsidxmisc) \
00548 { \
00549 \
00550 LATE_CLASS_LOAD(pcpd_Methodref->class_index); \
00551 \
00552 \
00553 clsidxmisc = pcpd_Methodref->LOCAL_Methodref_binding.clsidxJVM;\
00554 if (jvm_class_index_null == clsidxmisc) \
00555 { \
00556 thread_throw_exception(thridx, \
00557 THREAD_STATUS_THREW_ERROR, \
00558 JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR); \
00559 \
00560 } \
00561 } \
00562 \
00563 mthidxmisc = pcpd_Methodref->LOCAL_Methodref_binding.mthidxJVM; \
00564 if (jvm_method_index_bad == mthidxmisc) \
00565 { \
00566 thread_throw_exception(thridx, \
00567 THREAD_STATUS_THREW_ERROR, \
00568 JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR); \
00569 \
00570 } \
00571 \
00572 pcfsmisc = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs; \
00573 pmth = pcfsmisc->methods[mthidxmisc]
00574
00575
00576
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589
00590
00591 #define CHECK_VALID_CODEATRIDX(codeatridx) \
00592 if (jvm_attribute_index_bad == codeatridx) \
00593 { \
00594 thread_throw_exception(thridx, \
00595 THREAD_STATUS_THREW_ERROR, \
00596 JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR); \
00597 \
00598 }
00599
00600
00601
00602
00603
00604
00605
00606
00607
00608
00609
00610
00611
00612
00613
00614
00615
00616 #define CHECK_STATIC_METHOD \
00617 \
00618 \
00619 if (!(ACC_STATIC & pmth->access_flags)) \
00620 { \
00621 thread_throw_exception(thridx, \
00622 THREAD_STATUS_THREW_ERROR, \
00623 JVMCLASS_JAVA_LANG_VERIFYERROR); \
00624 \
00625 }
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643 #define CHECK_INSTANCE_METHOD \
00644 \
00645 \
00646 if (ACC_STATIC & pmth->access_flags) \
00647 { \
00648 thread_throw_exception(thridx, \
00649 THREAD_STATUS_THREW_ERROR, \
00650 JVMCLASS_JAVA_LANG_VERIFYERROR); \
00651 \
00652 }
00653
00654
00655 #if 0
00656
00657
00658
00659
00660
00661
00662
00663
00664
00665
00666
00667
00668
00669
00670
00671
00672 #define CHECK_ABSTRACT_METHOD \
00673 \
00674 \
00675 if (!(ACC_ABSTRACT & pmth->access_flags)) \
00676 { \
00677 thread_throw_exception(thridx, \
00678 THREAD_STATUS_THREW_ERROR, \
00679 \
00680 \
00681 \
00682 JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
00683 \
00684 }
00685 #endif
00686
00687
00688
00689
00690
00691
00692
00693
00694
00695
00696
00697
00698
00699
00700
00701
00702
00703
00704 #define CHECK_NOT_ABSTRACT_METHOD \
00705 \
00706 \
00707 if (ACC_ABSTRACT & pmth->access_flags) \
00708 { \
00709 thread_throw_exception(thridx, \
00710 THREAD_STATUS_THREW_ERROR, \
00711 JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
00712 \
00713 }
00714
00715
00716
00717
00718
00719
00720
00721
00722
00723
00724
00725
00726
00727
00728
00729
00730
00731
00732 #define CHECK_NOT_ABSTRACT_CLASS \
00733 \
00734 \
00735 if (ACC_ABSTRACT & \
00736 OBJECT_CLASS_LINKAGE(objhashmisc)->pcfs->access_flags) \
00737 { \
00738 thread_throw_exception(thridx, \
00739 THREAD_STATUS_THREW_ERROR, \
00740 JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
00741 \
00742 }
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759
00760 #define CHECK_NOT_ARRAY_OBJECT \
00761 \
00762 \
00763 if (OBJECT_STATUS_ARRAY & \
00764 CLASS(OBJECT_CLASS_LINKAGE(objhashmisc)->clsidx).status) \
00765 { \
00766 thread_throw_exception(thridx, \
00767 THREAD_STATUS_THREW_ERROR, \
00768 JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
00769 \
00770 }
00771
00772
00773
00774
00775
00776
00777
00778
00779
00780
00781
00782
00783
00784
00785
00786
00787
00788
00789 #define CHECK_NOT_INTERFACE_CLASS \
00790 \
00791 \
00792 if (ACC_INTERFACE & \
00793 OBJECT_CLASS_LINKAGE(objhashmisc)->pcfs->access_flags) \
00794 { \
00795 thread_throw_exception(thridx, \
00796 THREAD_STATUS_THREW_ERROR, \
00797 JVMCLASS_JAVA_LANG_INSTANTIATIONERROR); \
00798 \
00799 }
00800
00801
00802
00803
00804
00805
00806
00807
00808
00809
00810
00811
00812
00813
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824 #define CALCULATE_FIELD_INFO_FROM_FIELD_REFERENCE(Fieldref) \
00825 pcpd = pcfs->constant_pool[Fieldref]; \
00826 pcpd_Fieldref = PTR_THIS_CP_Fieldref(pcpd); \
00827 clsidxmisc = pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM; \
00828 if (jvm_class_index_null == clsidxmisc) \
00829 { \
00830 \
00831 LATE_CLASS_LOAD(pcpd_Fieldref->class_index); \
00832 \
00833 \
00834 clsidxmisc = pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM; \
00835 if (jvm_class_index_null == clsidxmisc) \
00836 { \
00837 thread_throw_exception(thridx, \
00838 THREAD_STATUS_THREW_ERROR, \
00839 JVMCLASS_JAVA_LANG_NOSUCHFIELDERROR); \
00840 \
00841 } \
00842 } \
00843 \
00844 fluidxmisc = pcpd_Fieldref->LOCAL_Fieldref_binding.fluidxJVM; \
00845 if (jvm_field_index_bad == fluidxmisc) \
00846 { \
00847 thread_throw_exception(thridx, \
00848 THREAD_STATUS_THREW_ERROR, \
00849 JVMCLASS_JAVA_LANG_NOSUCHFIELDERROR); \
00850 \
00851 } \
00852 \
00853 pcfsmisc = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs; \
00854 fluidxmisc = pcpd_Fieldref->LOCAL_Fieldref_binding.fluidxJVM; \
00855 pfld = pcfsmisc \
00856 ->fields[CLASS(clsidxmisc) \
00857 .class_static_field_lookup[fluidxmisc]]
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875 #define CHECK_VALID_FIELDLOOKUPIDX(fluidx) \
00876 if (jvm_field_lookup_index_bad == fluidx) \
00877 { \
00878 thread_throw_exception(thridx, \
00879 THREAD_STATUS_THREW_ERROR, \
00880 JVMCLASS_JAVA_LANG_NOSUCHFIELDERROR); \
00881 \
00882 }
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900 #define CHECK_STATIC_FIELD \
00901 \
00902 \
00903 if (!(ACC_STATIC & pfld->access_flags)) \
00904 { \
00905 thread_throw_exception(thridx, \
00906 THREAD_STATUS_THREW_ERROR, \
00907 JVMCLASS_JAVA_LANG_INCOMPATIBLECLASSCHANGEERROR); \
00908 \
00909 }
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927 #define CHECK_INSTANCE_FIELD \
00928 \
00929 \
00930 if (ACC_STATIC & pfld->access_flags) \
00931 { \
00932 thread_throw_exception(thridx, \
00933 THREAD_STATUS_THREW_ERROR, \
00934 JVMCLASS_JAVA_LANG_INCOMPATIBLECLASSCHANGEERROR); \
00935 \
00936 }
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957 #define CHECK_FINAL_FIELD_CURRENT_CLASS \
00958 \
00959 { \
00960 jvm_class_index clsidxTMP; \
00961 \
00962 GET_PC_FIELD(thridx, clsidxTMP, clsidx); \
00963 \
00964 \
00965 if ((ACC_FINAL & pfld->access_flags) && \
00966 (clsidxTMP != pcpd_Fieldref \
00967 ->LOCAL_Fieldref_binding.clsidxJVM)) \
00968 { \
00969 thread_throw_exception(thridx, \
00970 THREAD_STATUS_THREW_ERROR, \
00971 JVMCLASS_JAVA_LANG_ILLEGALACCESSERROR); \
00972 \
00973 } \
00974 }
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995 #define CHECK_TWO_ACCESSES \
00996 \
00997 (((pcpd_Fieldref->LOCAL_Fieldref_binding.jvaluetypeJVM == \
00998 BASETYPE_CHAR_J) || \
00999 (pcpd_Fieldref->LOCAL_Fieldref_binding.jvaluetypeJVM == \
01000 BASETYPE_CHAR_D)) \
01001 ? rtrue \
01002 : rfalse)
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031 #define PUTDATA(data_array) \
01032 switch (pcpd_Fieldref->LOCAL_Fieldref_binding.jvaluetypeJVM) \
01033 { \
01034 case BASETYPE_CHAR_B: \
01035 POP(thridx, \
01036 data_array._jbyte, \
01037 jbyte); \
01038 break; \
01039 \
01040 case BASETYPE_CHAR_C: \
01041 POP(thridx, \
01042 data_array._jchar, \
01043 jchar); \
01044 break; \
01045 \
01046 case BASETYPE_CHAR_D: \
01047
01048
01049
01050
01051
01052
01053
01054 \
01055 POP(thridx, jitmp2, jint); \
01056 POP(thridx, jitmp1, jint); \
01057 data_array._jdouble = bytegames_combine_jdouble(jitmp1, \
01058 jitmp2); \
01059 break; \
01060 \
01061 case BASETYPE_CHAR_F: \
01062
01063
01064
01065
01066
01067
01068
01069 \
01070 POP(thridx, jitmp1, jint); \
01071 data_array._jfloat = FORCE_JFLOAT(jitmp1); \
01072 break; \
01073 \
01074 case BASETYPE_CHAR_I: \
01075 POP(thridx, \
01076 data_array._jint, \
01077 jint); \
01078 break; \
01079 \
01080 case BASETYPE_CHAR_J: \
01081
01082
01083
01084
01085
01086
01087
01088 \
01089 POP(thridx, jitmp2, jint); \
01090 POP(thridx, jitmp1, jint); \
01091 jltmp = bytegames_combine_jlong(jitmp1, jitmp2); \
01092 data_array._jlong = jltmp; \
01093 break; \
01094 \
01095 case BASETYPE_CHAR_L: \
01096 POP(thridx, \
01097 data_array._jobjhash, \
01098 jvm_object_hash); \
01099 break; \
01100 \
01101 case BASETYPE_CHAR_S: \
01102 POP(thridx, \
01103 data_array._jshort, \
01104 jshort); \
01105 break; \
01106 \
01107 case BASETYPE_CHAR_Z: \
01108 POP(thridx, \
01109 data_array._jboolean, \
01110 jboolean); \
01111 break; \
01112 \
01113 case BASETYPE_CHAR_ARRAY: \
01114 POP(thridx, \
01115 data_array._jarray, \
01116 jvm_object_hash); \
01117 break; \
01118 \
01119 case LOCAL_BASETYPE_ERROR: \
01120 default: \
01121 \
01122 thread_throw_exception(thridx, \
01123 THREAD_STATUS_THREW_ERROR, \
01124 JVMCLASS_JAVA_LANG_VERIFYERROR); \
01125 \
01126 break; \
01127 }
01128
01129
01130
01131
01132
01133
01134 #define PUTSTATIC \
01135 PUTDATA(CLASS(pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM) \
01136 .class_static_field_data[fluidxmisc])
01137
01138
01139
01140
01141
01142
01143 #define PUTFIELD \
01144 PUTDATA(OBJECT(pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM) \
01145 .object_instance_field_data[fluidxmisc])
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174 #define GETDATA(data_array) \
01175 switch (pcpd_Fieldref->LOCAL_Fieldref_binding.jvaluetypeJVM) \
01176 { \
01177 case BASETYPE_CHAR_B: \
01178 PUSH(thridx, \
01179 (jint) data_array._jbyte); \
01180 break; \
01181 \
01182 case BASETYPE_CHAR_C: \
01183 PUSH(thridx, \
01184 (jint) data_array._jchar); \
01185 break; \
01186 \
01187 case BASETYPE_CHAR_D: \
01188 bytegames_split_jdouble(data_array._jdouble, \
01189 &jitmp1, \
01190 &jitmp2); \
01191
01192
01193
01194
01195 \
01196 PUSH(thridx, jitmp1); \
01197 PUSH(thridx, jitmp2); \
01198 break; \
01199 \
01200 case BASETYPE_CHAR_F: \
01201
01202
01203
01204
01205
01206
01207
01208 \
01209 jitmp1 = FORCE_JINT(data_array._jfloat); \
01210 PUSH(thridx, jitmp1); \
01211 break; \
01212 \
01213 case BASETYPE_CHAR_I: \
01214 PUSH(thridx, \
01215 (jint) data_array._jint); \
01216 break; \
01217 \
01218 case BASETYPE_CHAR_J: \
01219 bytegames_split_jlong(data_array._jlong, \
01220 &jitmp1, \
01221 &jitmp2); \
01222
01223
01224
01225
01226 \
01227 PUSH(thridx, jitmp1); \
01228 PUSH(thridx, jitmp2); \
01229 break; \
01230 \
01231 case BASETYPE_CHAR_L: \
01232 PUSH(thridx, \
01233 (jint) data_array._jobjhash); \
01234 break; \
01235 \
01236 case BASETYPE_CHAR_S: \
01237 PUSH(thridx, \
01238 (jint) data_array._jshort); \
01239 break; \
01240 \
01241 case BASETYPE_CHAR_Z: \
01242 PUSH(thridx, \
01243 (jint) data_array._jboolean); \
01244 break; \
01245 \
01246 case BASETYPE_CHAR_ARRAY: \
01247 PUSH(thridx, \
01248 (jint) data_array._jarray); \
01249 break; \
01250 \
01251 case LOCAL_BASETYPE_ERROR: \
01252 default: \
01253 \
01254 thread_throw_exception(thridx, \
01255 THREAD_STATUS_THREW_ERROR, \
01256 JVMCLASS_JAVA_LANG_VERIFYERROR); \
01257 \
01258 break; \
01259 }
01260
01261
01262
01263
01264
01265
01266 #define GETSTATIC \
01267 GETDATA(CLASS(pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM) \
01268 .class_static_field_data[fluidxmisc])
01269
01270
01271
01272
01273
01274
01275 #define GETFIELD \
01276 GETDATA(OBJECT(pcpd_Fieldref->LOCAL_Fieldref_binding.clsidxJVM) \
01277 .object_instance_field_data[fluidxmisc])
01278
01279
01280
01281
01282
01283
01284
01285 static jmp_buf opcode_end_thread_return;
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309 static int opcode_end_thread_setup(rvoid)
01310 {
01311
01312
01313
01314
01315
01316 return(setjmp(opcode_end_thread_return));
01317
01318 }
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348 static rvoid opcode_end_thread_test(jvm_thread_index thridx)
01349 {
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360
01361 if (THREAD(thridx).fp_end_program < THREAD(thridx).fp)
01362 {
01363
01364 return;
01365 }
01366
01367
01368
01369 int rc = (int) EXIT_JVM_THREAD;
01370 longjmp(opcode_end_thread_return, rc);
01371
01372
01373 }
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384 rboolean opcode_calling_java_lang_linkageerror =
01385 CHEAT_AND_USE_FALSE_TO_INITIALIZE;
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399
01400
01401
01402
01403
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462 rvoid opcode_load_run_throwable(rchar *pThrowableEvent,
01463 jvm_thread_index thridx)
01464 {
01465
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476
01477 int nonlocal_rc = exit_exception_setup();
01478
01479 if (EXIT_MAIN_OKAY != nonlocal_rc)
01480 {
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491
01492 if (rnull == exit_LinkageError_subclass)
01493 {
01494 exit_LinkageError_subclass = "unknown";
01495 }
01496
01497 fprintfLocalStderr(
01498 "opcode_load_run_throwable: Recursive Error %d (%s): %s\n",
01499 nonlocal_rc,
01500 exit_get_name(nonlocal_rc),
01501 exit_LinkageError_subclass);
01502
01503 jvmutil_print_stack(thridx, (rchar *) rnull);
01504
01505
01506
01507
01508 if (rfalse == opcode_calling_java_lang_linkageerror)
01509 {
01510 opcode_calling_java_lang_linkageerror = rtrue;
01511
01512 opcode_load_run_throwable(JVMCLASS_JAVA_LANG_LINKAGEERROR,
01513 rtrue);
01514
01515 opcode_calling_java_lang_linkageerror = rfalse;
01516 }
01517
01518 exit_jvm(nonlocal_rc);
01519
01520 }
01521
01522 if (jvm_thread_index_null == thridx)
01523 {
01524 sysErrMsg("opcode_load_run_throwable",
01525 "Invalid thread index %d for throwable class %s",
01526 thridx, pThrowableEvent);
01527 return;
01528 }
01529
01530
01531
01532
01533
01534
01535
01536
01537 jvm_class_index clsidx =
01538 class_load_resolve_clinit(pThrowableEvent,
01539 thridx,
01540 rfalse,
01541 rfalse);
01542
01543
01544
01545
01546
01547 (rvoid) GC_CLASS_MKREF_FROM_CLASS(jvm_class_index_null, clsidx);
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557 jvm_object_hash objhash=
01558 object_instance_new(THREAD_STATUS_EMPTY,
01559 CLASS_OBJECT_LINKAGE(clsidx)->pcfs,
01560 clsidx,
01561 LOCAL_CONSTANT_NO_ARRAY_DIMS,
01562 (jint *) rnull,
01563 rtrue,
01564 thridx);
01565
01566
01567
01568
01569
01570 (rvoid) GC_OBJECT_MKREF_FROM_OBJECT(jvm_object_hash_null, objhash);
01571 (rvoid) GC_OBJECT_RMREF_FROM_OBJECT(jvm_object_hash_null, objhash);
01572
01573
01574
01575
01576
01577 (rvoid) GC_CLASS_RMREF_FROM_CLASS(jvm_class_index_null, clsidx);
01578
01579 return;
01580
01581 }
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593
01594
01595
01596
01597
01598
01599
01600
01601
01602
01603
01604
01605
01606
01607
01608
01609
01610
01611
01612
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634 rboolean opcode_run(jvm_thread_index thridx,
01635 rboolean check_timeslice)
01636 {
01637
01638
01639
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653
01654
01655
01656
01657
01658
01659 int nonlocal_thread_return = EXIT_JVM_INTERNAL;
01660
01661
01662 int nonlocal_rc = thread_exception_setup(thridx);
01663
01664
01665 if (THREAD_STATUS_EMPTY != nonlocal_rc)
01666 {
01667
01668
01669
01670
01671
01672 nonlocal_rc &= (THREAD_STATUS_THREW_EXCEPTION |
01673 THREAD_STATUS_THREW_ERROR |
01674 THREAD_STATUS_THREW_THROWABLE |
01675 THREAD_STATUS_THREW_UNCAUGHT);
01676
01677
01678
01679
01680
01681 rchar *pThrowableEvent = THREAD(thridx).pThrowableEvent;
01682
01683
01684
01685
01686
01687 THREAD(thridx).pThrowableEvent = (rchar *) rnull;
01688 THREAD(thridx).status &= ~(THREAD_STATUS_THREW_EXCEPTION |
01689 THREAD_STATUS_THREW_ERROR |
01690 THREAD_STATUS_THREW_THROWABLE |
01691 THREAD_STATUS_THREW_UNCAUGHT);
01692
01693
01694
01695
01696
01697 if (THREAD_STATUS_THREW_EXCEPTION & nonlocal_rc)
01698 {
01699
01700 }
01701 else
01702 if (THREAD_STATUS_THREW_ERROR & nonlocal_rc)
01703 {
01704
01705 }
01706 else
01707 if (THREAD_STATUS_THREW_THROWABLE & nonlocal_rc)
01708 {
01709
01710 }
01711 else
01712 if (THREAD_STATUS_THREW_UNCAUGHT & nonlocal_rc)
01713 {
01714
01715
01716
01717
01718
01719
01720 jvm_class_index clsidx = class_find_by_prchar(
01721 JVMCLASS_JAVA_LANG_THREADGROUP);
01722
01723 if (jvm_class_index_null == clsidx)
01724 {
01725
01726 sysErrMsg("opcode_run",
01727 "Cannot find class %s",
01728 JVMCLASS_JAVA_LANG_THREADGROUP);
01729
01730 jvmutil_print_stack(thridx, (rchar *) rnull);
01731
01732 exit_jvm(EXIT_JVM_CLASS);
01733
01734 }
01735
01736
01737
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754 jvm_sp fp_save_end_program = THREAD(thridx).fp_end_program;
01755
01756
01757
01758
01759
01760
01761 THREAD(thridx).fp_end_program = THREAD(thridx).fp;
01762
01763
01764 jvm_method_index mthidx =
01765 method_find_by_prchar(clsidx,
01766 JVMCFG_UNCAUGHT_EXCEPTION_METHOD,
01767 JVMCFG_UNCAUGHT_EXCEPTION_PARMS);
01768
01769 if (jvm_method_index_bad == mthidx)
01770 {
01771 exit_throw_exception(EXIT_JVM_METHOD,
01772 JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR);
01773
01774 }
01775
01776
01777
01778
01779 ClassFile *pcfs = CLASS_OBJECT_LINKAGE(clsidx)->pcfs;
01780
01781 jvm_attribute_index codeatridx =
01782 pcfs->methods[mthidx]
01783 ->LOCAL_method_binding.codeatridxJVM;
01784
01785 if (jvm_attribute_index_bad == codeatridx)
01786 {
01787 exit_throw_exception(EXIT_JVM_ATTRIBUTE,
01788 JVMCLASS_JAVA_LANG_NOSUCHMETHODERROR);
01789
01790 }
01791
01792 if (jvm_attribute_index_native == codeatridx)
01793 {
01794
01795 native_run_method(thridx,
01796 pcfs
01797 ->methods[mthidx]
01798 ->LOCAL_method_binding.nmordJVM,
01799 clsidx,
01800 pcfs->methods[mthidx]->name_index,
01801 pcfs->methods[mthidx]
01802 ->descriptor_index);
01803 }
01804 else
01805 {
01806 Code_attribute *pca = (Code_attribute *)
01807 &pcfs->methods[mthidx]->attributes[codeatridx];
01808 PUSH_FRAME(thridx, pca->max_locals);
01809 PUT_PC_IMMEDIATE(thridx,
01810 clsidx,
01811 mthidx,
01812 pcfs
01813 ->methods[mthidx]
01814 ->LOCAL_method_binding.codeatridxJVM,
01815 pcfs
01816 ->methods[mthidx]
01817 ->LOCAL_method_binding.excpatridxJVM,
01818 CODE_CONSTRAINT_START_PC);
01819
01820 if (rfalse == opcode_run(thridx, rfalse))
01821 {
01822
01823 sysErrMsg("opcode_run",
01824 "Cannot run exception method %s %s%s",
01825 JVMCLASS_JAVA_LANG_THREADGROUP,
01826 JVMCFG_UNCAUGHT_EXCEPTION_METHOD,
01827 JVMCFG_UNCAUGHT_EXCEPTION_PARMS);
01828
01829 jvmutil_print_stack(thridx, (rchar *) rnull);
01830
01831 exit_jvm(EXIT_JVM_THREAD);
01832
01833 }
01834 }
01835
01836
01837
01838
01839
01840
01841
01842 THREAD(thridx).fp_end_program = fp_save_end_program;
01843
01844
01845 if (rfalse == threadstate_request_complete(thridx))
01846 {
01847 sysErrMsg("opcode_run",
01848 "Unable to move completed thread %d to '%s' state",
01849 thridx,
01850 thread_state_get_name(THREAD_STATE_COMPLETE));
01851 THREAD_REQUEST_NEXT_STATE(badlogic, thridx);
01852
01853 return(rfalse);
01854 }
01855
01856 return(rfalse);
01857
01858 }
01859 else
01860 {
01861
01862 }
01863
01864
01865 if (nonlocal_rc & (THREAD_STATUS_THREW_EXCEPTION |
01866 THREAD_STATUS_THREW_ERROR |
01867 THREAD_STATUS_THREW_THROWABLE))
01868 {
01869
01870
01871
01872
01873
01874
01875
01876
01877
01878
01879
01880
01881
01882 opcode_load_run_throwable(pThrowableEvent, thridx);
01883
01884
01885
01886
01887
01888
01889 if (!(THREAD_STATUS_THREW_EXCEPTION & nonlocal_rc))
01890 {
01891
01892 if (rfalse == threadstate_request_complete(thridx))
01893 {
01894 sysErrMsg("opcode_run",
01895 "Unable to move aborted thread %d to '%s' state",
01896 thridx,
01897 thread_state_get_name(
01898 THREAD_STATE_COMPLETE));
01899 THREAD_REQUEST_NEXT_STATE(badlogic, thridx);
01900
01901 return(rfalse);
01902 }
01903 }
01904
01905 }
01906
01907 }
01908
01909
01910
01911
01912
01913
01914
01915
01916
01917
01918
01919 else
01920 {
01921
01922
01923
01924
01925
01926
01927
01928
01929 jvm_pc *pc = THIS_PC(thridx);
01930 ClassFile *pcfs = THIS_PCFS(thridx);
01931 jvm_virtual_opcode *pcode = DEREFERENCE_PC_CODE_BASE(thridx);
01932
01933
01934 rboolean iswide;
01935 iswide = rfalse;
01936
01937 jvm_virtual_opcode opcode;
01938 u1 op1u1idx;
01939 u2 op1u2idx;
01940 u4 op1u4off;
01941
01942 jint jitmp1;
01943 jint jitmp2;
01944 jlong jltmp;
01945 jfloat jftmp;
01946 jdouble jdtmp;
01947
01948
01949
01950 cp_info_dup *pcpd;
01951 CONSTANT_Class_info *pcpd_Class;
01952 CONSTANT_Fieldref_info *pcpd_Fieldref;
01953 CONSTANT_Methodref_info *pcpd_Methodref;
01954 CONSTANT_NameAndType_info *pcpd_NameAndType;
01955 CONSTANT_Utf8_info *pcpd_Utf8;
01956
01957 field_info *pfld;
01958 method_info *pmth;
01959
01960 ClassFile *pcfsmisc;
01961 u2 cpidxmisc;
01962 jvm_class_index clsidxmisc;
01963 jvm_method_index mthidxmisc;
01964 jvm_object_hash objhashmisc;
01965 jvm_field_lookup_index fluidxmisc;
01966 rchar *prchar_clsname;
01967 rushort special_obj_misc;
01968
01969
01970
01971 nonlocal_thread_return = opcode_end_thread_setup();
01972
01973
01974 if (EXIT_MAIN_OKAY != nonlocal_thread_return)
01975 {
01976 ;
01977 }
01978 else
01979 {
01980
01981
01982
01983
01984
01985
01986 while (
01987 (THREAD_STATE_RUNNING == THREAD(thridx).this_state)&&
01988
01989
01990 ((rfalse == check_timeslice) ||
01991 (rfalse == pjvm->timeslice_expired)))
01992 {
01993
01994 opcode = pcode[pc->offset++];
01995
01996
01997
01998
01999
02000
02001
02002
02003 static void dummy1(void) { char *p, *dummy2; dummy2 = p; dummy1(); }
02004 #define STUB { dummy1(); }
02005
02006 switch(opcode)
02007 {
02008 case OPCODE_00_NOP:
02009 break;
02010
02011 case OPCODE_01_ACONST_NULL:
02012
02013 STUB;
02014 PUSH(thridx, FORCE_JINT(jvm_object_hash_null));
02015 break;
02016
02017 case OPCODE_02_ICONST_M1:
02018 case OPCODE_03_ICONST_0:
02019 case OPCODE_04_ICONST_1:
02020 case OPCODE_05_ICONST_2:
02021 case OPCODE_06_ICONST_3:
02022 case OPCODE_07_ICONST_4:
02023 case OPCODE_08_ICONST_5:
02024 PUSH(thridx, (((jint) opcode) - ((jint) OPCODE_03_ICONST_0)));
02025 break;
02026
02027 case OPCODE_09_LCONST_0:
02028 case OPCODE_0A_LCONST_1:
02029
02030 STUB;
02031 jltmp = (((jlong) opcode) - ((jlong) OPCODE_09_LCONST_0));
02032
02033 bytegames_split_jlong(jltmp, &jitmp1, &jitmp2);
02034
02035 PUSH(thridx, jitmp1);
02036 PUSH(thridx, jitmp2);
02037 break;
02038
02039 case OPCODE_0B_FCONST_0:
02040 case OPCODE_0C_FCONST_1:
02041 case OPCODE_0D_FCONST_2:
02042
02043 STUB;
02044 jftmp = (jfloat) (((jint) opcode) - ((jint) OPCODE_0B_FCONST_0));
02045
02046 PUSH(thridx, FORCE_JINT(jftmp));
02047 break;
02048
02049 case OPCODE_0E_DCONST_0:
02050 case OPCODE_0F_DCONST_1:
02051
02052 STUB;
02053 jdtmp = (jdouble) (((jint) opcode) - ((jint) OPCODE_0E_DCONST_0));
02054
02055 bytegames_split_jdouble(jltmp, &jitmp1, &jitmp2);
02056
02057 PUSH(thridx, jitmp1);
02058 PUSH(thridx, jitmp2);
02059
02060 break;
02061
02062 case OPCODE_10_BIPUSH:
02063
02064 STUB;
02065 break;
02066
02067 case OPCODE_11_SIPUSH:
02068
02069 STUB;
02070 break;
02071
02072 case OPCODE_12_LDC:
02073
02074 STUB;
02075 break;
02076
02077 case OPCODE_13_LDC_W:
02078
02079 STUB;
02080 break;
02081
02082 case OPCODE_14_LDC2_W:
02083
02084 STUB;
02085 break;
02086
02087 case OPCODE_15_ILOAD:
02088
02089 STUB;
02090 iswide = rfalse;
02091 break;
02092
02093 case OPCODE_16_LLOAD:
02094
02095 STUB;
02096 iswide = rfalse;
02097 break;
02098
02099 case OPCODE_17_FLOAD:
02100
02101 STUB;
02102 iswide = rfalse;
02103 break;
02104
02105 case OPCODE_18_DLOAD:
02106
02107 STUB;
02108 iswide = rfalse;
02109 break;
02110
02111 case OPCODE_19_ALOAD:
02112
02113 STUB;
02114 iswide = rfalse;
02115 break;
02116
02117 case OPCODE_1A_ILOAD_0:
02118 case OPCODE_1B_ILOAD_1:
02119 case OPCODE_1C_ILOAD_2:
02120 case OPCODE_1D_ILOAD_3:
02121
02122 STUB;
02123 break;
02124
02125 case OPCODE_1E_LLOAD_0:
02126 case OPCODE_1F_LLOAD_1:
02127 case OPCODE_20_LLOAD_2:
02128 case OPCODE_21_LLOAD_3:
02129
02130 STUB;
02131 break;
02132
02133 case OPCODE_22_FLOAD_0:
02134 case OPCODE_23_FLOAD_1:
02135 case OPCODE_24_FLOAD_2:
02136 case OPCODE_25_FLOAD_3:
02137
02138 STUB;
02139 break;
02140
02141 case OPCODE_26_DLOAD_0:
02142 case OPCODE_27_DLOAD_1:
02143 case OPCODE_28_DLOAD_2:
02144 case OPCODE_29_DLOAD_3:
02145
02146 STUB;
02147 break;
02148
02149 case OPCODE_2A_ALOAD_0:
02150 case OPCODE_2B_ALOAD_1:
02151 case OPCODE_2C_ALOAD_2:
02152 case OPCODE_2D_ALOAD_3:
02153
02154 STUB;
02155 break;
02156
02157 case OPCODE_2E_IALOAD:
02158
02159 STUB;
02160 break;
02161
02162 case OPCODE_2F_LALOAD:
02163
02164 STUB;
02165 break;
02166
02167 case OPCODE_30_FALOAD:
02168
02169 STUB;
02170 break;
02171
02172 case OPCODE_31_DALOAD:
02173
02174 STUB;
02175 break;
02176
02177 case OPCODE_32_AALOAD:
02178
02179 STUB;
02180 break;
02181
02182 case OPCODE_33_BALOAD:
02183
02184 STUB;
02185 break;
02186
02187 case OPCODE_34_CALOAD:
02188
02189 STUB;
02190 break;
02191
02192 case OPCODE_35_SALOAD:
02193
02194 STUB;
02195 break;
02196
02197 case OPCODE_36_ISTORE:
02198
02199 STUB;
02200 iswide = rfalse;
02201 break;
02202
02203 case OPCODE_37_LSTORE:
02204
02205 STUB;
02206 iswide = rfalse;
02207 break;
02208
02209 case OPCODE_38_FSTORE:
02210
02211 STUB;
02212 iswide = rfalse;
02213 break;
02214
02215 case OPCODE_39_DSTORE:
02216
02217 STUB;
02218 iswide = rfalse;
02219 break;
02220
02221 case OPCODE_3A_ASTORE:
02222
02223 STUB;
02224 iswide = rfalse;
02225 break;
02226
02227 case OPCODE_3B_ISTORE_0:
02228 case OPCODE_3C_ISTORE_1:
02229 case OPCODE_3D_ISTORE_2:
02230 case OPCODE_3E_ISTORE_3:
02231
02232 STUB;
02233 break;
02234
02235 case OPCODE_3F_LSTORE_0:
02236 case OPCODE_40_LSTORE_1:
02237 case OPCODE_41_LSTORE_2:
02238 case OPCODE_42_LSTORE_3:
02239
02240 STUB;
02241 break;
02242
02243 case OPCODE_43_FSTORE_0:
02244 case OPCODE_44_FSTORE_1:
02245 case OPCODE_45_FSTORE_2:
02246 case OPCODE_46_FSTORE_3:
02247
02248 STUB;
02249 break;
02250
02251 case OPCODE_47_DSTORE_0:
02252 case OPCODE_48_DSTORE_1:
02253 case OPCODE_49_DSTORE_2:
02254 case OPCODE_4A_DSTORE_3:
02255
02256 STUB;
02257 break;
02258
02259 case OPCODE_4B_ASTORE_0:
02260 case OPCODE_4C_ASTORE_1:
02261 case OPCODE_4D_ASTORE_2:
02262 case OPCODE_4E_ASTORE_3:
02263
02264 STUB;
02265 break;
02266
02267 case OPCODE_4F_IASTORE:
02268
02269 STUB;
02270 break;
02271
02272 case OPCODE_50_LASTORE:
02273
02274 STUB;
02275 break;
02276
02277 case OPCODE_51_FASTORE:
02278
02279 STUB;
02280 break;
02281
02282 case OPCODE_52_DASTORE:
02283
02284 STUB;
02285 break;
02286
02287 case OPCODE_53_AASTORE:
02288
02289 STUB;
02290 break;
02291
02292 case OPCODE_54_BASTORE:
02293
02294 STUB;
02295 break;
02296
02297 case OPCODE_55_CASTORE:
02298
02299 STUB;
02300 break;
02301
02302 case OPCODE_56_SASTORE:
02303
02304 STUB;
02305 break;
02306
02307 case OPCODE_57_POP:
02308
02309 STUB;
02310 break;
02311
02312 case OPCODE_58_POP2:
02313
02314 STUB;
02315 break;
02316
02317 case OPCODE_59_DUP:
02318
02319 STUB;
02320 break;
02321
02322 case OPCODE_5A_DUP_X1:
02323
02324 STUB;
02325 break;
02326
02327 case OPCODE_5B_DUP_X2:
02328
02329 STUB;
02330 break;
02331
02332 case OPCODE_5C_DUP2:
02333
02334 STUB;
02335 break;
02336
02337 case OPCODE_5D_DUP2_X1:
02338
02339 STUB;
02340 break;
02341
02342 case OPCODE_5E_DUP2_X2:
02343
02344 STUB;
02345 break;
02346
02347 case OPCODE_5F_SWAP:
02348
02349 STUB;
02350 break;
02351
02352 case OPCODE_60_IADD:
02353
02354 STUB;
02355 break;
02356
02357 case OPCODE_61_LADD:
02358
02359 STUB;
02360 break;
02361
02362 case OPCODE_62_FADD:
02363
02364 STUB;
02365 break;
02366
02367 case OPCODE_63_DADD:
02368
02369 STUB;
02370 break;
02371
02372 case OPCODE_64_ISUB:
02373
02374 STUB;
02375 break;
02376
02377 case OPCODE_65_LSUB:
02378
02379 STUB;
02380 break;
02381
02382 case OPCODE_66_FSUB:
02383
02384 STUB;
02385 break;
02386
02387 case OPCODE_67_DSUB:
02388
02389 STUB;
02390 break;
02391
02392 case OPCODE_68_IMUL:
02393
02394 STUB;
02395 break;
02396
02397 case OPCODE_69_LMUL:
02398
02399 STUB;
02400 break;
02401
02402 case OPCODE_6A_FMUL:
02403
02404 STUB;
02405 break;
02406
02407 case OPCODE_6B_DMUL:
02408
02409 STUB;
02410 break;
02411
02412 case OPCODE_6C_IDIV:
02413
02414 STUB;
02415 break;
02416
02417 case OPCODE_6D_LDIV:
02418
02419 STUB;
02420 break;
02421
02422 case OPCODE_6E_FDIV:
02423
02424 STUB;
02425 break;
02426
02427 case OPCODE_6F_DDIV:
02428
02429 STUB;
02430 break;
02431
02432 case OPCODE_70_IREM:
02433
02434 STUB;
02435 break;
02436
02437 case OPCODE_71_LREM:
02438
02439 STUB;
02440 break;
02441
02442 case OPCODE_72_FREM:
02443
02444 STUB;
02445 break;
02446
02447 case OPCODE_73_DREM:
02448
02449 STUB;
02450 break;
02451
02452 case OPCODE_74_INEG:
02453
02454 STUB;
02455 break;
02456
02457 case OPCODE_75_LNEG:
02458
02459 STUB;
02460 break;
02461
02462 case OPCODE_76_FNEG:
02463
02464 STUB;
02465 break;
02466
02467 case OPCODE_77_DNEG:
02468
02469 STUB;
02470 break;
02471
02472 case OPCODE_78_ISHL:
02473
02474 STUB;
02475 break;
02476
02477 case OPCODE_79_LSHL:
02478
02479 STUB;
02480 break;
02481
02482 case OPCODE_7A_ISHR:
02483
02484 STUB;
02485 break;
02486
02487 case OPCODE_7B_LSHR:
02488
02489 STUB;
02490 break;
02491
02492 case OPCODE_7C_IUSHR:
02493
02494 STUB;
02495 break;
02496
02497 case OPCODE_7D_LUSHR:
02498
02499 STUB;
02500 break;
02501
02502 case OPCODE_7E_IAND:
02503
02504 STUB;
02505 break;
02506
02507 case OPCODE_7F_LAND:
02508
02509 STUB;
02510 break;
02511
02512 case OPCODE_80_IOR:
02513
02514 STUB;
02515 break;
02516
02517 case OPCODE_81_LOR:
02518
02519 STUB;
02520 break;
02521
02522 case OPCODE_82_IXOR:
02523
02524 STUB;
02525 break;
02526
02527 case OPCODE_83_LXOR:
02528
02529 STUB;
02530 break;
02531
02532 case OPCODE_84_IINC:
02533
02534 STUB;
02535 break;
02536
02537 case OPCODE_85_I2L:
02538
02539 STUB;
02540 break;
02541
02542 case OPCODE_86_I2F:
02543
02544 STUB;
02545 break;
02546
02547 case OPCODE_87_I2D:
02548
02549 STUB;
02550 break;
02551
02552 case OPCODE_88_L2I:
02553
02554 STUB;
02555 break;
02556
02557 case OPCODE_89_L2F:
02558
02559 STUB;
02560 break;
02561
02562 case OPCODE_8A_L2D:
02563
02564 STUB;
02565 break;
02566
02567 case OPCODE_8B_F2I:
02568
02569 STUB;
02570 break;
02571
02572 case OPCODE_8C_F2L:
02573
02574 STUB;
02575 break;
02576
02577 case OPCODE_8D_F2D:
02578
02579 STUB;
02580 break;
02581
02582 case OPCODE_8E_D2I:
02583
02584 STUB;
02585 break;
02586
02587 case OPCODE_8F_D2L:
02588
02589 STUB;
02590 break;
02591
02592 case OPCODE_90_D2F:
02593
02594 STUB;
02595 break;
02596
02597 case OPCODE_91_I2B:
02598
02599 STUB;
02600 break;
02601
02602 case OPCODE_92_I2C:
02603
02604 STUB;
02605 break;
02606
02607 case OPCODE_93_I2S:
02608
02609 STUB;
02610 break;
02611
02612 case OPCODE_94_LCMP:
02613
02614 STUB;
02615 break;
02616
02617 case OPCODE_95_FCMPL:
02618
02619 STUB;
02620 break;
02621
02622 case OPCODE_96_FCMPG:
02623
02624 STUB;
02625 break;
02626
02627 case OPCODE_97_DCMPL:
02628
02629 STUB;
02630 break;
02631
02632 case OPCODE_98_DCMPG:
02633
02634 STUB;
02635 break;
02636
02637 case OPCODE_99_IFEQ:
02638
02639 STUB;
02640 break;
02641
02642 case OPCODE_9A_IFNE:
02643
02644 STUB;
02645 break;
02646
02647 case OPCODE_9B_IFLT:
02648
02649 STUB;
02650 break;
02651
02652 case OPCODE_9C_IFGE:
02653
02654 STUB;
02655 break;
02656
02657 case OPCODE_9D_IFGT:
02658
02659 STUB;
02660 break;
02661
02662 case OPCODE_9E_IFLE:
02663
02664 STUB;
02665 break;
02666
02667 case OPCODE_9F_IF_ICMPEQ:
02668
02669 STUB;
02670 break;
02671
02672 case OPCODE_A0_IF_ICMPNE:
02673
02674 STUB;
02675 break;
02676
02677 case OPCODE_A1_IF_ICMPLT:
02678
02679 STUB;
02680 break;
02681
02682 case OPCODE_A2_IF_ICMPGE:
02683
02684 STUB;
02685 break;
02686
02687 case OPCODE_A3_IF_ICMPGT:
02688
02689 STUB;
02690 break;
02691
02692 case OPCODE_A4_IF_ICMPLE:
02693
02694 STUB;
02695 break;
02696
02697 case OPCODE_A5_IF_ACMPEQ:
02698
02699 STUB;
02700 break;
02701
02702 case OPCODE_A6_IF_ACMPNE:
02703
02704 STUB;
02705 break;
02706
02707 case OPCODE_A7_GOTO:
02708
02709 STUB;
02710 break;
02711
02712 case OPCODE_A8_JSR:
02713
02714 STUB;
02715 break;
02716
02717 case OPCODE_A9_RET:
02718
02719 STUB;
02720 iswide = rfalse;
02721
02722
02723
02724
02725
02726 opcode_end_thread_test(thridx);
02727 break;
02728
02729 case OPCODE_AA_TABLESWITCH:
02730 STUB;
02731 break;
02732
02733 case OPCODE_AB_LOOKUPSWITCH:
02734
02735 STUB;
02736 break;
02737
02738 case OPCODE_AC_IRETURN:
02739
02740 STUB;
02741 opcode_end_thread_test(thridx);
02742 break;
02743
02744
02745 case OPCODE_AD_LRETURN:
02746 STUB;
02747 opcode_end_thread_test(thridx);
02748 break;
02749
02750
02751 case OPCODE_AE_FRETURN:
02752 STUB;
02753 opcode_end_thread_test(thridx);
02754
02755 break;
02756
02757 case OPCODE_AF_DRETURN:
02758 STUB;
02759
02760 opcode_end_thread_test(thridx);
02761 break;
02762
02763 case OPCODE_B0_ARETURN:
02764
02765 STUB;
02766 opcode_end_thread_test(thridx);
02767 break;
02768
02769 case OPCODE_B1_RETURN:
02770
02771 CALCULATE_METHOD_INFO_FROM_PC;
02772
02773
02774
02775
02776 if (ACC_SYNCHRONIZED & pmth->access_flags)
02777 {
02778 (rvoid) objectutil_unsynchronize(
02779 CLASS(clsidxmisc).class_objhash,
02780 CURRENT_THREAD);
02781 }
02782
02783
02784
02785
02786
02787
02788 POP_FRAME(thridx);
02789
02790
02791
02792
02793
02794 opcode_end_thread_test(thridx);
02795 break;
02796
02797 case OPCODE_B2_GETSTATIC:
02798
02799
02800 GET_U2_OPERAND(op1u2idx);
02801
02802
02803 CHECK_CP_TAG(op1u2idx, CONSTANT_Fieldref);
02804
02805
02806 CALCULATE_FIELD_INFO_FROM_FIELD_REFERENCE(op1u2idx);
02807
02808
02809 CHECK_VALID_FIELDLOOKUPIDX(fluidxmisc);
02810
02811
02812 CHECK_STATIC_FIELD;
02813
02814
02815 CHECK_FINAL_FIELD_CURRENT_CLASS;
02816
02817
02818 GETSTATIC;
02819
02820 break;
02821
02822 case OPCODE_B3_PUTSTATIC:
02823
02824
02825 GET_U2_OPERAND(op1u2idx);
02826
02827
02828 CHECK_CP_TAG(op1u2idx, CONSTANT_Fieldref);
02829
02830
02831 CALCULATE_FIELD_INFO_FROM_FIELD_REFERENCE(op1u2idx);
02832
02833
02834 CHECK_VALID_FIELDLOOKUPIDX(fluidxmisc);
02835
02836
02837 CHECK_STATIC_FIELD;
02838
02839
02840 CHECK_FINAL_FIELD_CURRENT_CLASS;
02841
02842
02843 PUTSTATIC;
02844
02845 break;
02846
02847 case OPCODE_B4_GETFIELD:
02848
02849 STUB;
02850 break;
02851
02852 case OPCODE_B5_PUTFIELD:
02853
02854 STUB;
02855 break;
02856
02857 case OPCODE_B6_INVOKEVIRTUAL:
02858
02859 STUB;
02860 break;
02861
02862 case OPCODE_B7_INVOKESPECIAL:
02863
02864 STUB;
02865 break;
02866
02867 case OPCODE_B8_INVOKESTATIC:
02868
02869
02870 GET_U2_OPERAND(op1u2idx);
02871
02872
02873 CHECK_CP_TAG(op1u2idx, CONSTANT_Methodref);
02874
02875
02876 CALCULATE_METHOD_INFO_FROM_METHOD_REFERENCE(op1u2idx);
02877
02878
02879 CHECK_VALID_CODEATRIDX(pcpd_Methodref
02880 ->LOCAL_Methodref_binding.codeatridxJVM);
02881
02882
02883 CHECK_STATIC_METHOD;
02884
02885
02886 CHECK_NOT_ABSTRACT_METHOD;
02887
02888
02889
02890
02891
02892
02893
02894
02895 if (ACC_SYNCHRONIZED & pmth->access_flags)
02896 {
02897 if (rfalse == objectutil_synchronize(
02898 CLASS(clsidxmisc).class_objhash,
02899 CURRENT_THREAD))
02900 {
02901 pc->offset -= sizeof(u1);
02902 pc->offset -= sizeof(u2);
02903 break;
02904 }
02905 }
02906
02907 if (ACC_NATIVE & pmth->access_flags)
02908 {
02909 cpidxmisc = pcpd_Methodref->name_and_type_index;
02910 pcpd = pcfs->constant_pool[cpidxmisc];
02911 pcpd_NameAndType = PTR_THIS_CP_NameAndType(pcpd);
02912
02913 native_run_method(CURRENT_THREAD,
02914 pcpd_Methodref
02915 ->LOCAL_Methodref_binding
02916 .nmordJVM,
02917 clsidxmisc,
02918 pcpd_NameAndType->name_index,
02919 pcpd_NameAndType->descriptor_index);
02920 }
02921 else
02922 {
02923 ;
02924
02925
02926
02927
02928
02929 }
02930 break;
02931
02932 case OPCODE_B9_INVOKEINTERFACE:
02933
02934 STUB;
02935 break;
02936
02937 case OPCODE_BA_XXXUNUSEDXXX1:
02938 goto unused_reserved_opcodes;
02939
02940 case OPCODE_BB_NEW:
02941
02942
02943 GET_U2_OPERAND(op1u2idx);
02944
02945
02946 CHECK_CP_TAG(op1u2idx, CONSTANT_Class);
02947 CHECK_NOT_ABSTRACT_CLASS;
02948 CHECK_NOT_ARRAY_OBJECT;
02949 CHECK_NOT_INTERFACE_CLASS;
02950
02951
02952 #if 0
02953 CALCULATE_CLASS_INFO_FROM_CLASS_REFERENCE(op1u2idx);
02954 #else
02955 pcpd = pcfs->constant_pool[op1u2idx];
02956 pcpd_Class = PTR_THIS_CP_Class(pcpd);
02957 clsidxmisc = pcpd_Class->LOCAL_Class_binding.clsidxJVM;
02958 if (jvm_class_index_null == clsidxmisc)
02959 {
02960
02961
02962
02963 jvm_constant_pool_index cpidxOLD = op1u2idx;
02964
02965
02966 #if 0
02967 LATE_CLASS_LOAD(cpidxOLD);
02968 #else
02969
02970 pcpd = pcfs->constant_pool[cpidxOLD];
02971 pcpd_Class = PTR_THIS_CP_Class(pcpd);
02972
02973 pcpd = pcfs->constant_pool[pcpd_Class->name_index];
02974 pcpd_Utf8 = PTR_THIS_CP_Utf8(pcpd);
02975
02976 prchar_clsname = utf_utf2prchar(pcpd_Utf8);
02977
02978
02979 clsidxmisc = class_load_resolve_clinit(prchar_clsname,
02980 CURRENT_THREAD,
02981 rfalse,
02982 rfalse);
02983
02984 HEAP_FREE_DATA(prchar_clsname);
02985
02986
02987 if (jvm_class_index_null == clsidxmisc)
02988 {
02989 thread_throw_exception(thridx,
02990 THREAD_STATUS_THREW_ERROR,
02991 JVMCLASS_JAVA_LANG_NOCLASSDEFFOUNDERROR);
02992
02993 }
02994 #endif
02995 }
02996 pcfsmisc = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs;
02997 #endif
02998
02999
03000 special_obj_misc = OBJECT_STATUS_EMPTY;
03001
03002 if (0 == utf_prchar_classname_strcmp(JVMCLASS_JAVA_LANG_THREAD,
03003 pcfsmisc,
03004 pcfsmisc->this_class))
03005 {
03006 special_obj_misc |= OBJECT_STATUS_THREAD;
03007 }
03008
03009 objhashmisc =
03010 object_instance_new(special_obj_misc,
03011 pcfsmisc,
03012 clsidxmisc,
03013 0,
03014 (rvoid *) rnull,
03015 rfalse,
03016 thridx);
03017
03018
03019 PUSH(thridx, (jint) objhashmisc);
03020
03021 break;
03022
03023 case OPCODE_BC_NEWARRAY:
03024
03025 STUB;
03026 break;
03027
03028 case OPCODE_BD_ANEWARRAY:
03029
03030
03031 GET_U2_OPERAND(op1u2idx);
03032
03033
03034
03035
03036
03037
03038
03039 CHECK_CP_TAG(op1u2idx, CONSTANT_Class);
03040
03041
03042
03043 #if 1
03044 CALCULATE_CLASS_INFO_FROM_CLASS_REFERENCE(op1u2idx);
03045 #else
03046 pcpd = pcfs->constant_pool[op1u2idx];
03047 pcpd_Class = PTR_THIS_CP_Class(pcpd);
03048 clsidxmisc = pcpd_Class->LOCAL_Class_binding.clsidxJVM;
03049 if (jvm_class_index_null == clsidxmisc)
03050 {
03051
03052
03053
03054 jvm_constant_pool_index cpidxOLD = op1u2idx;
03055
03056
03057 #if 0
03058 LATE_CLASS_LOAD(cpidxOLD);
03059 #else
03060
03061 pcpd = pcfs->constant_pool[cpidxOLD];
03062 pcpd_Class = PTR_THIS_CP_Class(pcpd);
03063
03064 pcpd = pcfs->constant_pool[pcpd_Class->name_index];
03065 pcpd_Utf8 = PTR_THIS_CP_Utf8(pcpd);
03066
03067 prchar_clsname = utf_utf2prchar(pcpd_Utf8);
03068
03069
03070 clsidxmisc = class_load_resolve_clinit(prchar_clsname,
03071 CURRENT_THREAD,
03072 rfalse,
03073 rfalse);
03074
03075 HEAP_FREE_DATA(prchar_clsname);
03076
03077
03078 if (jvm_class_index_null == clsidxmisc)
03079 {
03080 thread_throw_exception(thridx,
03081 THREAD_STATUS_THREW_ERROR,
03082 JVMCLASS_JAVA_LANG_NOCLASSDEFFOUNDERROR);
03083
03084 }
03085 #endif
03086 }
03087 pcfsmisc = CLASS_OBJECT_LINKAGE(clsidxmisc)->pcfs;
03088 #endif
03089
03090
03091 POP(thridx, jitmp1, jint );
03092
03093
03094 if (0 > jitmp1)
03095 {
03096 thread_throw_exception(thridx,
03097 THREAD_STATUS_THREW_EXCEPTION,
03098 JVMCLASS_JAVA_LANG_NEGATIVEARRAYSIZEEXCEPTION);
03099
03100 }
03101
03102
03103 #if 1
03104 special_obj_misc = OBJECT_STATUS_ARRAY;
03105 #else
03106 special_obj_misc = OBJECT_STATUS_EMPTY;
03107 if (CLASS_STATUS_ARRAY & CLASS(clsidxmisc).status)
03108 {
03109 special_obj_misc |= OBJECT_STATUS_ARRAY;
03110 }
03111 #endif
03112
03113 if (0 == utf_prchar_classname_strcmp(JVMCLASS_JAVA_LANG_THREAD,
03114 pcfsmisc,
03115 pcfsmisc->this_class))
03116 {
03117 special_obj_misc |= OBJECT_STATUS_THREAD;
03118 }
03119
03120
03121 objhashmisc =
03122 object_instance_new(special_obj_misc,
03123 pcfsmisc,
03124 clsidxmisc,
03125 ((OBJECT_STATUS_ARRAY & special_obj_misc)
03126 ? 1
03127 : 0),
03128 &jitmp1,
03129 rfalse,
03130 thridx);
03131
03132
03133 PUSH(thridx, (jint) objhashmisc);
03134
03135 break;
03136
03137 case OPCODE_BE_ARRAYLENGTH:
03138
03139 STUB;
03140 break;
03141
03142 case OPCODE_BF_ATHROW:
03143
03144 STUB;
03145 break;
03146
03147 case OPCODE_C0_CHECKCAST:
03148
03149 STUB;
03150 break;
03151
03152 case OPCODE_C1_INSTANCEOF:
03153
03154 STUB;
03155 break;
03156
03157 case OPCODE_C2_MONITORENTER:
03158
03159 STUB;
03160 break;
03161
03162 case OPCODE_C3_MONITOREXIT:
03163
03164 STUB;
03165 break;
03166
03167 case OPCODE_C4_WIDE:
03168
03169 iswide = rtrue;
03170 break;
03171
03172 case OPCODE_C5_MULTIANEWARRAY:
03173
03174 STUB;
03175 break;
03176
03177 case OPCODE_C6_IFNULL:
03178
03179 STUB;
03180 break;
03181
03182 case OPCODE_C7_IFNONNULL:
03183
03184 STUB;
03185 break;
03186
03187 case OPCODE_C8_GOTO_W:
03188
03189 STUB;
03190 break;
03191
03192 case OPCODE_C9_JSR_W:
03193
03194 STUB;
03195 break;
03196
03197
03198
03199 case OPCODE_CA_BREAKPOINT:
03200
03201 STUB;
03202 break;
03203
03204
03205
03206 case OPCODE_CB_UNUSED:
03207 case OPCODE_CC_UNUSED:
03208 case OPCODE_CD_UNUSED:
03209 case OPCODE_CE_UNUSED:
03210 case OPCODE_CF_UNUSED:
03211
03212 case OPCODE_D0_UNUSED:
03213 case OPCODE_D1_UNUSED:
03214 case OPCODE_D2_UNUSED:
03215 case OPCODE_D3_UNUSED:
03216 case OPCODE_D4_UNUSED:
03217 case OPCODE_D5_UNUSED:
03218 case OPCODE_D6_UNUSED:
03219 case OPCODE_D7_UNUSED:
03220 case OPCODE_D8_UNUSED:
03221 case OPCODE_D9_UNUSED:
03222 case OPCODE_DA_UNUSED:
03223 case OPCODE_DB_UNUSED:
03224 case OPCODE_DC_UNUSED:
03225 case OPCODE_DD_UNUSED:
03226 case OPCODE_DE_UNUSED:
03227 case OPCODE_DF_UNUSED:
03228
03229 case OPCODE_E0_UNUSED:
03230 case OPCODE_E1_UNUSED:
03231 case OPCODE_E2_UNUSED:
03232 case OPCODE_E3_UNUSED:
03233 case OPCODE_E4_UNUSED:
03234 case OPCODE_E5_UNUSED:
03235 case OPCODE_E6_UNUSED:
03236 case OPCODE_E7_UNUSED:
03237 case OPCODE_E8_UNUSED:
03238 case OPCODE_E9_UNUSED:
03239 case OPCODE_EA_UNUSED:
03240 case OPCODE_EB_UNUSED:
03241 case OPCODE_EC_UNUSED:
03242 case OPCODE_ED_UNUSED:
03243 case OPCODE_EE_UNUSED:
03244 case OPCODE_EF_UNUSED:
03245
03246 case OPCODE_F0_UNUSED:
03247 case OPCODE_F1_UNUSED:
03248 case OPCODE_F2_UNUSED:
03249 case OPCODE_F3_UNUSED:
03250 case OPCODE_F4_UNUSED:
03251 case OPCODE_F5_UNUSED:
03252 case OPCODE_F6_UNUSED:
03253 case OPCODE_F7_UNUSED:
03254 case OPCODE_F8_UNUSED:
03255 case OPCODE_F9_UNUSED:
03256 case OPCODE_FA_UNUSED:
03257 case OPCODE_FB_UNUSED:
03258 case OPCODE_FC_UNUSED:
03259 case OPCODE_FD_UNUSED:
03260
03261
03262 case OPCODE_FE_IMPDEP1:
03263
03264 unused_reserved_opcodes:
03265
03266
03267 STUB;
03268 break;
03269
03270 case OPCODE_FF_IMPDEP2:
03271
03272 STUB;
03273 break;
03274
03275 }
03276
03277
03278
03279 }
03280 }
03281
03282 }
03283
03284
03285
03286
03287
03288
03289
03290
03291
03292
03293
03294
03295
03296
03297 if((rtrue == check_timeslice) && (rtrue == pjvm->timeslice_expired))
03298 {
03299 pjvm->timeslice_expired = rfalse;
03300 }
03301
03302
03303
03304
03305
03306
03307
03308
03309
03310
03311
03312
03313
03314
03315
03316
03317
03318
03319 if (CHECK_FINAL_STACK_FRAME_ULTIMATE(thridx) &&
03320 (THREAD_STATE_RUNNING == THREAD(thridx).this_state))
03321 {
03322
03323 if (rfalse == threadstate_request_complete(thridx))
03324 {
03325 sysErrMsg("opcode_run",
03326 "Unable to move completed thread %d to '%s' state",
03327 thridx,
03328 thread_state_get_name(THREAD_STATE_COMPLETE));
03329 THREAD_REQUEST_NEXT_STATE(badlogic, thridx);
03330
03331 return(rfalse);
03332 }
03333 }
03334
03335
03336
03337
03338
03339
03340
03341
03342
03343
03344
03345
03346 if (EXIT_JVM_THREAD == nonlocal_thread_return)
03347 {
03348 return(rtrue);
03349 }
03350
03351
03352
03353
03354
03355
03356
03357 if ((THREAD_STATUS_EMPTY == nonlocal_rc) &&
03358 (EXIT_MAIN_OKAY == nonlocal_thread_return))
03359 {
03360 return(rtrue);
03361 }
03362 else
03363 {
03364
03365 if (rfalse == threadstate_request_complete(thridx))
03366 {
03367 sysErrMsg("opcode_run",
03368 "Unable to move completed thread %d to '%s' state",
03369 thridx,
03370 thread_state_get_name(THREAD_STATE_COMPLETE));
03371 THREAD_REQUEST_NEXT_STATE(badlogic, thridx);
03372
03373 return(rfalse);
03374 }
03375
03376
03377
03378
03379 return(rfalse);
03380 }
03381
03382 }
03383
03384
03385
03386