summaryrefslogtreecommitdiff
path: root/template/id.h.tmpl
blob: d5e82a989ecc492e849f2b9647389be811caa6a4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
%#  -*- c -*-
/* DO NOT EDIT THIS FILE DIRECTLY */
/**********************************************************************

  id.h -

  $Author$
  created at: Sun Oct 19 21:12:51 2008

  Copyright (C) 2007 Koichi Sasada

**********************************************************************/
<%
require 'optparse'

op_id_offset = 128

method_ids = %w[
  Intern
  MethodMissing
  Length
  Size
  EmptyP
  Gets
  Succ
  Each
  Lambda
  Send
  __send__
  Initialize
  Initialize_copy
  Initialize_clone
  Initialize_dup
  UScore
  Bitblt
  Answer
]

token_op_ids = %w[
  tDOT2 tDOT3 tUPLUS tUMINUS tPOW tDSTAR tCMP tLSHFT tRSHFT
  tLEQ tGEQ tEQ tEQQ tNEQ tMATCH tNMATCH tAREF tASET
  tCOLON2 tCOLON3
]

preserved_ids = %w[
  NULL
  Respond_to
  Respond_to_missing
  IFUNC
  CFUNC
  _core_set_method_alias
  _core_set_variable_alias
  _core_undef_method
  _core_define_method
  _core_define_singleton_method
  _core_set_postexe
  _core_hash_from_ary
  _core_hash_merge_ary
  _core_hash_merge_ptr
  _core_hash_merge_kwd
]
%>
#ifndef RUBY_ID_H
#define RUBY_ID_H

#define ID_SCOPE_SHIFT 3
#define ID_SCOPE_MASK 0x07
#define ID_LOCAL      0x00
#define ID_INSTANCE   0x01
#define ID_GLOBAL     0x03
#define ID_ATTRSET    0x04
#define ID_CONST      0x05
#define ID_CLASS      0x06
#define ID_JUNK       0x07
#define ID_INTERNAL   ID_JUNK

#define symIFUNC ID2SYM(idIFUNC)
#define symCFUNC ID2SYM(idCFUNC)

% token_op_ids.each_with_index do |token, index|
#define RUBY_TOKEN_<%=token[/\At(.+)\z/, 1]%> <%=op_id_offset + index%>
% end
#define RUBY_TOKEN(t) RUBY_TOKEN_##t

enum ruby_method_ids {
    idDot2 = RUBY_TOKEN(DOT2),
    idDot3 = RUBY_TOKEN(DOT3),
    idUPlus = RUBY_TOKEN(UPLUS),
    idUMinus = RUBY_TOKEN(UMINUS),
    idPow = RUBY_TOKEN(POW),
    idCmp = RUBY_TOKEN(CMP),
    idPLUS = '+',
    idMINUS = '-',
    idMULT = '*',
    idDIV = '/',
    idMOD = '%',
    idLT = '<',
    idLTLT = RUBY_TOKEN(LSHFT),
    idLE = RUBY_TOKEN(LEQ),
    idGT = '>',
    idGE = RUBY_TOKEN(GEQ),
    idEq = RUBY_TOKEN(EQ),
    idEqq = RUBY_TOKEN(EQQ),
    idNeq = RUBY_TOKEN(NEQ),
    idNot = '!',
    idBackquote = '`',
    idEqTilde = RUBY_TOKEN(MATCH),
    idNeqTilde = RUBY_TOKEN(NMATCH),
    idAREF = RUBY_TOKEN(AREF),
    idASET = RUBY_TOKEN(ASET),
    tPRESERVED_ID_BEGIN = <%=op_id_offset + token_op_ids.size - 1%>,
% preserved_ids.each do |token|
    id<%=token%>,
% end
    tPRESERVED_ID_END,
% method_ids.each do |token|
    t<%=token%>,
% end
#define TOKEN2ID(n) id##n = ((t##n<<ID_SCOPE_SHIFT)|ID_LOCAL)
% method_ids.each do |token|
    TOKEN2ID(<%=token%>),
% end
    tLAST_OP_ID = tPRESERVED_ID_END-1,
    idLAST_OP_ID = tLAST_OP_ID >> ID_SCOPE_SHIFT
};

#endif /* RUBY_ID_H */