|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
Возможно это все знают, но для меня это было неожиданно. Оказывается внутри скрипта процедуру можно вызвать тремя разными способами:
Код:
procedure start begin end procedure sum(variable arg0, variable arg1, variable arg2) begin return arg0 + arg1 + arg2; end procedure Test begin variable strVar; variable result; /* Способ 1 */ result := sum(3, 7, 15); /* Способ 2 */ result := "sum"(3, 7, 15); /* Способ 3 */ strVar := "sum"; result := strVar(3, 7, 15); end
Для первого способа генерится самый короткий код, для третьего самый длинный. Дамп откомпилированного скрипта приведен ниже:
Код:
============== Procedures table ================== ======== Procedure 0 ======== Name offset: 0x00000006 Type: 0x00000000 // No special types Time: 0x00000000 // 0 Expression offset: 0x00000000 Body offset: 0x000000DE Number of args: 0x00000000 // 0 ======== Procedure 1 ======== Name offset: 0x00000018 Type: 0x00000000 // No special types Time: 0x00000000 // 0 Expression offset: 0x00000000 Body offset: 0x000000DE Number of args: 0x00000000 // 0 ======== Procedure 2 ======== Name offset: 0x00000020 Type: 0x00000000 // No special types Time: 0x00000000 // 0 Expression offset: 0x00000000 Body offset: 0x000000F8 Number of args: 0x00000003 // 3 ======== Procedure 3 ======== Name offset: 0x00000026 Type: 0x00000000 // No special types Time: 0x00000000 // 0 Expression offset: 0x00000000 Body offset: 0x0000013A Number of args: 0x00000000 // 0 ============== Namespace ================== 0x00000006: ".............." 0x00000018: "start" 0x00000020: "sum" 0x00000026: "Test" ================== 4 item(s) ============== Stringspace ================== 0x00000006: "sum" ================== 1 item(s) ============== Global variables values ================== Not found ============== Exported variables ================== Not found ============== Procedures ================== 0: .............. (0x000000de) =============================== 1: start (0x000000de) =============================== 0x000000DE: 0x802B - O_PUSH_BASE 0x000000E0: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x000000E6: 0x800D - O_D_TO_A 0x000000E8: 0x8019 - O_SWAPA 0x000000EA: 0x802A - O_POP_TO_BASE 0x000000EC: 0x8029 - O_POP_BASE 0x000000EE: 0x800C - O_A_TO_D 0x000000F0: 0x801C - O_POP_RETURN 0x000000F2: 0x802A - O_POP_TO_BASE 0x000000F4: 0x8029 - O_POP_BASE 0x000000F6: 0x801C - O_POP_RETURN 2: sum (0x000000f8) =============================== 0x000000F8: 0x802B - O_PUSH_BASE 0x000000FA: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x00000100: 0x8032 - O_FETCH 0x00000102: 0xC001 0x00000001 - O_INTOP(0x00000001) // 1 (1) 0x00000108: 0x8032 - O_FETCH 0x0000010A: 0x8039 - O_ADD 0x0000010C: 0xC001 0x00000002 - O_INTOP(0x00000002) // 2 (2) 0x00000112: 0x8032 - O_FETCH 0x00000114: 0x8039 - O_ADD 0x00000116: 0x800D - O_D_TO_A 0x00000118: 0x8019 - O_SWAPA 0x0000011A: 0x802A - O_POP_TO_BASE 0x0000011C: 0x8029 - O_POP_BASE 0x0000011E: 0x800C - O_A_TO_D 0x00000120: 0x801C - O_POP_RETURN 0x00000122: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x00000128: 0x800D - O_D_TO_A 0x0000012A: 0x8019 - O_SWAPA 0x0000012C: 0x802A - O_POP_TO_BASE 0x0000012E: 0x8029 - O_POP_BASE 0x00000130: 0x800C - O_A_TO_D 0x00000132: 0x801C - O_POP_RETURN 0x00000134: 0x802A - O_POP_TO_BASE 0x00000136: 0x8029 - O_POP_BASE 0x00000138: 0x801C - O_POP_RETURN 3: Test (0x0000013a) =============================== 0x0000013A: 0x802B - O_PUSH_BASE 0x0000013C: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x00000142: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x00000148: 0xC001 0x00000170 - O_INTOP(0x00000170) // 368 (368) 0x0000014E: 0x800D - O_D_TO_A 0x00000150: 0xC001 0x00000003 - O_INTOP(0x00000003) // 3 (3) 0x00000156: 0xC001 0x00000007 - O_INTOP(0x00000007) // 7 (7) 0x0000015C: 0xC001 0x0000000f - O_INTOP(0x0000000f) // 15 (15) 0x00000162: 0xC001 0x00000003 - O_INTOP(0x00000003) // 3 (3) 0x00000168: 0xC001 0x00000002 - O_INTOP(0x00000002) // 2 (2) 0x0000016E: 0x8005 - O_CALL 0x00000170: 0xC001 0x00000001 - O_INTOP(0x00000001) // 1 (1) 0x00000176: 0x8031 - O_STORE 0x00000178: 0xC001 0x000001ac - O_INTOP(0x000001ac) // 428 (428) 0x0000017E: 0x800D - O_D_TO_A 0x00000180: 0xC001 0x00000003 - O_INTOP(0x00000003) // 3 (3) 0x00000186: 0xC001 0x00000007 - O_INTOP(0x00000007) // 7 (7) 0x0000018C: 0xC001 0x0000000f - O_INTOP(0x0000000f) // 15 (15) 0x00000192: 0xC001 0x00000003 - O_INTOP(0x00000003) // 3 (3) 0x00000198: 0x9001 0x00000006 - O_STRINGOP(0x00000006) // 6 (6) 0x0000019E: 0x8028 - O_LOOKUP_STRING_PROC 0x000001A0: 0x801B - O_DUP 0x000001A2: 0xC001 0x00000003 - O_INTOP(0x00000003) // 3 (3) 0x000001A8: 0x8027 - O_CHECK_ARG_COUNT 0x000001AA: 0x8005 - O_CALL 0x000001AC: 0xC001 0x00000001 - O_INTOP(0x00000001) // 1 (1) 0x000001B2: 0x8031 - O_STORE 0x000001B4: 0x9001 0x00000006 - O_STRINGOP(0x00000006) // 6 (6) 0x000001BA: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x000001C0: 0x8031 - O_STORE 0x000001C2: 0xC001 0x000001f8 - O_INTOP(0x000001f8) // 504 (504) 0x000001C8: 0x800D - O_D_TO_A 0x000001CA: 0xC001 0x00000003 - O_INTOP(0x00000003) // 3 (3) 0x000001D0: 0xC001 0x00000007 - O_INTOP(0x00000007) // 7 (7) 0x000001D6: 0xC001 0x0000000f - O_INTOP(0x0000000f) // 15 (15) 0x000001DC: 0xC001 0x00000003 - O_INTOP(0x00000003) // 3 (3) 0x000001E2: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x000001E8: 0x8032 - O_FETCH 0x000001EA: 0x8028 - O_LOOKUP_STRING_PROC 0x000001EC: 0x801B - O_DUP 0x000001EE: 0xC001 0x00000003 - O_INTOP(0x00000003) // 3 (3) 0x000001F4: 0x8027 - O_CHECK_ARG_COUNT 0x000001F6: 0x8005 - O_CALL 0x000001F8: 0xC001 0x00000001 - O_INTOP(0x00000001) // 1 (1) 0x000001FE: 0x8031 - O_STORE 0x00000200: 0xC001 0x00000000 - O_INTOP(0x00000000) // 0 (0) 0x00000206: 0x800D - O_D_TO_A 0x00000208: 0x8019 - O_SWAPA 0x0000020A: 0x802A - O_POP_TO_BASE 0x0000020C: 0x8029 - O_POP_BASE 0x0000020E: 0x800C - O_A_TO_D 0x00000210: 0x801C - O_POP_RETURN 0x00000212: 0x802A - O_POP_TO_BASE 0x00000214: 0x8029 - O_POP_BASE 0x00000216: 0x801C - O_POP_RETURN
|
Отправлено: 8:00 - 13 Апр., 2005
|
|
Alan Killenger
Пользователь
Откуда: Россия, Ижевск Регистрация: Июль 2004
Всего: 404 сообщения
|
Что-то скриптоманьяков не слышно. А по-моему, круто. Можно вызывать процедуры из *.msg файла? Шучу, нельзя конечно . (Отредактировал(а) Alan Killenger - 22:10 - 13 Апр., 2005)
|
Отправлено: 21:09 - 13 Апр., 2005
|
|
Anchorite
Пользователь
Откуда: Не здесь Регистрация: Янв. 2003
Всего: 283 сообщения
|
А че нельзя-то??? Извлек название и вызывай
|
Отправлено: 21:51 - 14 Апр., 2005
|
|
|
|