File: Subject.pike

package info (click to toggle)
pike8.0 8.0.1956-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 60,580 kB
  • sloc: ansic: 259,734; xml: 36,320; makefile: 3,748; sh: 1,713; cpp: 1,349; awk: 1,036; lisp: 655; javascript: 468; asm: 242; objc: 240; pascal: 157; sed: 34
file content (127 lines) | stat: -rw-r--r-- 2,809 bytes parent folder | download | duplicates (6)
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

#pike __REAL_VERSION__

//! This is a probe subject which you can send in somewhere to
//! get probed (not to be confused with a probe object, which
//! does some active probing). All calls to LFUNs will be printed
//! to stderr. It is possible to name the subject by passing a
//! string as the first and only argument when creating the subject
//! object.
//!
//! @example
//! > object s = Debug.Subject();
//! create()
//! > random(s);
//! _random()
//! (1) Result: 0
//! > abs(s);
//! `<(0)
//! _sprintf(79, ([ "indent":2 ]))
//! (2) Result: Debug.Subject
//! > abs(class { inherit Debug.Subject; int `<(mixed ... args) { return 1; } }());
//! create()
//! `-()
//! destroy()
//! (3) Result: 0
//! > pow(s,2);
//! `[]("pow")
//! Attempt to call the NULL-value
//! Unknown program: 0(2)

#define ENTER(X)                       \
  string t = sprintf("%{%O, %}", args); \
  werror("%s%s(%s)\n", id, #X,           \
	 has_suffix(t, ", ") ? t[..<2] : t)

#define PROXY(X,Y) X(mixed ... args) { ENTER(X); return Y; }

protected string id = "";

void create(mixed ... args)
{
  ENTER(create);
  if(sizeof(args)==1 && stringp(args[0]))
    id = "(" + args[0] + ") ";
}

void PROXY(destroy, 0);

mixed PROXY(`->, 0);
mixed PROXY(`->=, 0);
mixed PROXY(`[], 0);
mixed PROXY(`[]=, 0);

mixed PROXY(`+, 0);
mixed PROXY(`-, 0);
mixed PROXY(`&, 0);
mixed PROXY(`|, 0);
mixed PROXY(`^, 0);
mixed PROXY(`<<, 0);
mixed PROXY(`>>, 0);
mixed PROXY(`*, 0);
mixed PROXY(`/, 0);
mixed PROXY(`%, 0);
mixed PROXY(`~, 0);

int(0..1) PROXY(`==, 0);
int(0..1) PROXY(`<, 0);
int(0..1) PROXY(`>, 0);
int PROXY(`!, 0);

int PROXY(__hash, 0);
int PROXY(_sizeof, 0);
mixed PROXY(cast, 0);
mixed PROXY(`(), 0);

mixed PROXY(``+, 0);
mixed PROXY(``-, 0);
mixed PROXY(``&, 0);
mixed PROXY(``|, 0);
mixed PROXY(``^, 0);
mixed PROXY(``<<, 0);
mixed PROXY(``>>, 0);
mixed PROXY(``*, 0);
mixed PROXY(``/, 0);
mixed PROXY(``%, 0);

mixed PROXY(`+=, 0);

int(0..1) PROXY(_is_type, 0);
int PROXY(_equal, 0);
mixed PROXY(_m_delete, 0);

//! @ignore
array PROXY(_indices, ::_indices());
array PROXY(_values, ::_values());
//! @endignore

object _get_iterator(mixed ... args)
{
  ENTER(_get_iterator);
  string iid = id==""?"":id[1..<2];
  return this_program("("+iid+" iterator) ");
}

string _sprintf(int|void t, mapping|void opt, mixed ... x)
{
  string args = "";
  if(t)
    args += sprintf("'%c'", t);
  if(opt == ([]))
    args += ", ([])";
  else if(opt)
  {
    string tmp = sprintf("%O", opt);
    sscanf(tmp, "([ /*%*s*/\n  %s\n])", tmp);
    args += sprintf(", ([ %s ])", replace(tmp, "\n ", ""));
  }
  string tmp = sprintf("%{%O, %}", x);
  if(has_suffix(tmp, ", "))
    tmp = tmp[..<2];
  if(sizeof(tmp))
    args += ", " + tmp;
  werror("%s_sprintf(%s)\n", id, args);
  return "Debug.Subject" + id[..<1];
}

mixed PROXY(_random, 0);