Hack to make identifiers in globals in non-global-expression mode work.

This commit is contained in:
Sei Lisa 2014-07-28 19:20:36 +02:00
parent b441c1774f
commit 56d51b835c
3 changed files with 39 additions and 7 deletions

View file

@ -80,10 +80,10 @@ class outscript(object):
return '[]' return '[]'
if len(value) < 5: if len(value) < 5:
self.listmode = True self.listmode = True
ret = '[ ' + self.Value2LSL(value[0]) ret = '[' + self.Value2LSL(value[0])
for elem in value[1:]: for elem in value[1:]:
ret += ', ' + self.Value2LSL(elem) ret += ', ' + self.Value2LSL(elem)
ret += ' ]' ret += ']'
self.listmode = False self.listmode = False
return ret return ret
ret = '\n' ret = '\n'
@ -100,6 +100,9 @@ class outscript(object):
first = False first = False
self.indentlevel -= 1 self.indentlevel -= 1
return ret + self.dent() + self.indent + ']' return ret + self.dent() + self.indent + ']'
if tvalue == tuple and value[0] == 'IDENT': # HACK
return value[2]
assert False, u'Value of unknown type in Value2LSL: ' + repr(value) assert False, u'Value of unknown type in Value2LSL: ' + repr(value)
def dent(self): def dent(self):
@ -180,7 +183,7 @@ class outscript(object):
op = self.OutExpr(expr[2]) op = self.OutExpr(expr[2])
return op + ' = ' + op + ' ' + node[:-1] + ' (' + self.OutExpr(expr[3]) + ')' return op + ' = ' + op + ' ' + node[:-1] + ' (' + self.OutExpr(expr[3]) + ')'
raise Exception('Internal error: expression type "' + node + '" not handled') # pragma: no cover assert False, 'Internal error: expression type "' + node + '" not handled' # pragma: no cover
def OutCode(self, code): def OutCode(self, code):
#return self.dent() + '{\n' + self.dent() + '}\n' #return self.dent() + '{\n' + self.dent() + '}\n'

View file

@ -1347,22 +1347,38 @@ class parser(object):
return (S['IDENT'], S[tmp[1]], tok[1], self.FindScopeIndex(tok[1])) return (S['IDENT'], S[tmp[1]], tok[1], self.FindScopeIndex(tok[1]))
if tok[0] == '<': if tok[0] == '<':
value = [self.Parse_simple_expr()] value = [self.Parse_simple_expr()]
self.autocastcheck((0, self.PythonType2LSL[type(value[0])]), 'float') if type(value[0]) == tuple:
typnode = value[0]
else:
typnode = (0, self.PythonType2LSL[type(value[0])])
self.autocastcheck(typnode, 'float')
self.expect(',') self.expect(',')
self.NextToken() self.NextToken()
value.append(self.Parse_simple_expr()) value.append(self.Parse_simple_expr())
self.autocastcheck((0, self.PythonType2LSL[type(value[1])]), 'float') if type(value[1]) == tuple:
typnode = value[1]
else:
typnode = (0, self.PythonType2LSL[type(value[1])])
self.autocastcheck(typnode, 'float')
self.expect(',') self.expect(',')
self.NextToken() self.NextToken()
value.append(self.Parse_simple_expr()) value.append(self.Parse_simple_expr())
self.autocastcheck((0, self.PythonType2LSL[type(value[2])]), 'float') if type(value[2]) == tuple:
typnode = value[2]
else:
typnode = (0, self.PythonType2LSL[type(value[2])])
self.autocastcheck(typnode, 'float')
if self.tok[0] == '>': if self.tok[0] == '>':
self.NextToken() self.NextToken()
return Vector(value) return Vector(value)
self.expect(',') self.expect(',')
self.NextToken() self.NextToken()
value.append(self.Parse_simple_expr()) value.append(self.Parse_simple_expr())
self.autocastcheck((0, self.PythonType2LSL[type(value[3])]), 'float') if type(value[3]) == tuple:
typnode = value[3]
else:
typnode = (0, self.PythonType2LSL[type(value[3])])
self.autocastcheck(typnode, 'float')
self.expect('>') self.expect('>')
self.NextToken() self.NextToken()
return Quaternion(value) return Quaternion(value)

View file

@ -278,6 +278,19 @@ class Test03_Optimizer(UnitTestCase):
''', ['extendedassignment']) ''', ['extendedassignment'])
self.opt.optimize(p, self.parser.functions) self.opt.optimize(p, self.parser.functions)
self.outscript.output(p) self.outscript.output(p)
p = self.parser.parse('''
key k = "blah";
list L = [k, "xxxx", 1.0];
float f;
vector v = <f, 3, 4>;
default{timer(){}}
''', ['extendedassignment'])
self.opt.optimize(p, self.parser.functions)
out = self.outscript.output(p)
self.assertEqual(out, 'key k = "blah";\nlist L = [k, "xxxx", 1.];\n'
'float f;\nvector v = <f, 3, 4>;\ndefault\n{\n timer()\n'
' {\n }\n}\n')
def tearDown(self): def tearDown(self):
del self.parser del self.parser