/
ext_injection.php
39 lines (30 loc) · 1.19 KB
/
ext_injection.php
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
<?php
chdir(preg_replace('#/bin/ext_injection.php$#', '/src', realpath(__FILE__)));
// parse all these files
$inputs = 'find . -name ext_*.cpp | grep -Ev \'/ext/[^/]+.ext_hhvm.cpp\'';
$files = array();
exec($inputs, $files);
foreach ($files as $file) {
// Skip injection macros for the collection classes
if (preg_match("#/ext_collection\\.cpp$#", $file)) {
continue;
}
$contents = file_get_contents($file);
if ($contents === false) {
exit("unable to read $file\n");
}
$pattern = '/c_(\w+)::t_(\w+)([^\{\}]*)\{([\n\t ]+)'.
'(?:\w+INJECTION(?:_BUILTIN|)\([\w:, ]+\);[\n\t ]+)?([^\}])/s';
$replace = "c_\${1}::t_\${2}\${3}{\n ".
"INSTANCE_METHOD_INJECTION_BUILTIN(\${1}, \${1}::\${2});\${4}\${5}";
$replaced = preg_replace($pattern, $replace, $contents);
$pattern = '/c_(\w+)::ti_(\w+)([^\{\}]*)\{([\n\t ]+)'.
'(?:\w+INJECTION(?:_BUILTIN|)\([\w:, ]+\);[\n\t ]+)?([^\}])/s';
$replace = "c_\${1}::ti_\${2}\${3}{\n ".
"STATIC_METHOD_INJECTION_BUILTIN(\${1}, \${1}::\${2});\${4}\${5}";
$replaced = preg_replace($pattern, $replace, $replaced);
if ($replaced && $replaced !== $contents) {
file_put_contents($file, $replaced);
print "updated $file\n";
}
}