Skip to content

Instantly share code, notes, and snippets.

@mah0x211
Created April 19, 2013 03:26
Show Gist options
  • Select an option

  • Save mah0x211/5417916 to your computer and use it in GitHub Desktop.

Select an option

Save mah0x211/5417916 to your computer and use it in GitHub Desktop.
luajitがSegmentation faultで落ちる。こまた。
-- change string metatable
do
local meta = debug.getmetatable( '' );
meta.__index = function( str, field )
return nil;
end
meta.__add = function( op1, op2 )
local t1 = type( op1 );
local t2 = type( op2 );
if t1 == t2 then
return op1 .. op2;
elseif t1 == 'string' then
return op1 .. tostring( op2 );
end
return tostring( op1 ) .. op2;
end
end
local function isDef( self, val )
return ( val == nil or
val == 0 or
val == '' or
val == false ) and nil or val;
end
function mkNode( self, parent, ... )
local argv = {...};
local prev = parent;
local len = #argv;
local child = undefined;
local name = undefined;
local t,i;
-- lookup
for i = 1, len, 1 do
name = argv[i];
t = type( name );
if t == 'number' or ( t == 'string' and name ~= '' ) then
parent = prev;
child = prev[name];
if type( child ) == 'table' then
prev = child;
-- create new-node
elseif ( i + 1 ) < len then
local tail = prev;
local nodeName = name;
local node = {};
prev = node;
i = i + 1;
while i < len do
name = argv[i];
t = type( name );
if ( t == 'string' and name ~= '' ) or t == 'number' then
parent = prev;
child = {};
prev[name] = child;
prev = child;
-- invalid property name
else
return nil;
end
i = i + 1;
end
parent[name] = '';
tail[nodeName] = node;
break;
end
-- invalid property name
else
return nil;
end
end
return parent;
end
local page = {
mkNode = mkNode,
isDef = isDef
};
function page:test( CTX, UDATA )
local TMP = {}; local LOCAL = {};
CTX.res = CTX.res + ('\nset:v0 = ');
TMP._0 = self:mkNode(LOCAL, 'v0');
if TMP._0 then
TMP._0.v0 = 0;
end
CTX.res = CTX.res + (( self:isDef( LOCAL.v0 ) or '' ));
CTX.res = CTX.res + ('\nset:v1 = ');
TMP._0 = self:mkNode(LOCAL, 'v1');
if TMP._0 then
TMP._0.v1 = 1;
end
CTX.res = CTX.res + (( self:isDef( LOCAL.v1 ) or '' ));
CTX.res = CTX.res + ('\nset:v2 = ');
TMP._0 = self:mkNode(LOCAL, 'v2');
if TMP._0 then
TMP._0.v2 = 2;
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 + v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )+( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 + v1 + v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )+( self:isDef( LOCAL.v1 ) or 0 )+( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 + v2 + v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )+( self:isDef( LOCAL.v2 ) or 0 )+( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v1 + v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )+( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 + v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )+( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 + v2 + v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )+( self:isDef( LOCAL.v2 ) or 0 )+( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 + v0 + v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )+( self:isDef( LOCAL.v0 ) or 0 )+( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v2 + v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )+( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 + v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )+( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 + v0 + v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )+( self:isDef( LOCAL.v0 ) or 0 )+( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 + v1 + v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )+( self:isDef( LOCAL.v1 ) or 0 )+( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v0 - v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )-( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 - v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )-( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 - v1 - v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )-( self:isDef( LOCAL.v1 ) or 0 )-( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 - v2 - v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )-( self:isDef( LOCAL.v2 ) or 0 )-( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v1 - v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )-( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 - v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )-( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 - v2 - v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )-( self:isDef( LOCAL.v2 ) or 0 )-( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 - v0 - v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )-( self:isDef( LOCAL.v0 ) or 0 )-( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v2 - v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )-( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 - v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )-( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 - v0 - v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )-( self:isDef( LOCAL.v0 ) or 0 )-( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 - v1 - v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )-( self:isDef( LOCAL.v1 ) or 0 )-( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v0 * v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )*( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 * v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )*( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 * v1 * v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )*( self:isDef( LOCAL.v1 ) or 0 )*( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 * v2 * v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )*( self:isDef( LOCAL.v2 ) or 0 )*( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v1 * v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )*( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 * v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )*( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 * v2 * v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )*( self:isDef( LOCAL.v2 ) or 0 )*( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v1 * v0 * v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v1 ) or 0 )*( self:isDef( LOCAL.v0 ) or 0 )*( self:isDef( LOCAL.v2 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v2 * v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )*( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 * v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )*( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 * v0 * v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )*( self:isDef( LOCAL.v0 ) or 0 )*( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v2 * v1 * v0 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v2 ) or 0 )*( self:isDef( LOCAL.v1 ) or 0 )*( self:isDef( LOCAL.v0 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n\n put:v0 / v1 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )/( self:isDef( LOCAL.v1 ) or 0 );
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 / v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
-- !!!: Segmentation fault
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )/( self:isDef( LOCAL.v2 ) or 0 );
--]]
end
CTX.res = CTX.res + (( self:isDef( LOCAL.x ) or '' ));
CTX.res = CTX.res + ('\n put:v0 / v1 / v2 = ');
TMP._0 = self:mkNode(LOCAL, 'x');
if TMP._0 then
TMP._0.x = ( self:isDef( LOCAL.v0 ) or 0 )/( self:isDef( LOCAL.v1 ) or 0 )/( self:isDef( LOCAL.v2 ) or 0 );
end
end
local result = {
req = {},
res = '',
udata = {}
};
page:test( result, result.udata );
print( result.res );
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment