| OLD | NEW | 
|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python | 
| 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be | 
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. | 
| 5 | 5 | 
| 6 """code generator for GLES2 command buffers.""" | 6 """code generator for GLES2 command buffers.""" | 
| 7 | 7 | 
| 8 import itertools | 8 import itertools | 
| 9 import os | 9 import os | 
| 10 import os.path | 10 import os.path | 
| (...skipping 1295 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1306     'valid': [ | 1306     'valid': [ | 
| 1307       'GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM', | 1307       'GL_SUBSCRIBED_VALUES_BUFFER_CHROMIUM', | 
| 1308     ], | 1308     ], | 
| 1309   }, | 1309   }, | 
| 1310   'SubscriptionTarget': { | 1310   'SubscriptionTarget': { | 
| 1311     'type': 'GLenum', | 1311     'type': 'GLenum', | 
| 1312     'valid': [ | 1312     'valid': [ | 
| 1313       'GL_MOUSE_POSITION_CHROMIUM', | 1313       'GL_MOUSE_POSITION_CHROMIUM', | 
| 1314     ], | 1314     ], | 
| 1315   }, | 1315   }, | 
|  | 1316   'UniformParameter': { | 
|  | 1317     'type': 'GLenum', | 
|  | 1318     'valid': [ | 
|  | 1319       'GL_UNIFORM_SIZE', | 
|  | 1320       'GL_UNIFORM_TYPE', | 
|  | 1321       'GL_UNIFORM_NAME_LENGTH', | 
|  | 1322       'GL_UNIFORM_BLOCK_INDEX', | 
|  | 1323       'GL_UNIFORM_OFFSET', | 
|  | 1324       'GL_UNIFORM_ARRAY_STRIDE', | 
|  | 1325       'GL_UNIFORM_MATRIX_STRIDE', | 
|  | 1326       'GL_UNIFORM_IS_ROW_MAJOR', | 
|  | 1327     ], | 
|  | 1328     'invalid': [ | 
|  | 1329       'GL_UNIFORM_BLOCK_NAME_LENGTH', | 
|  | 1330     ], | 
|  | 1331   }, | 
|  | 1332   'UniformBlockParameter': { | 
|  | 1333     'type': 'GLenum', | 
|  | 1334     'valid': [ | 
|  | 1335       'GL_UNIFORM_BLOCK_BINDING', | 
|  | 1336       'GL_UNIFORM_BLOCK_DATA_SIZE', | 
|  | 1337       'GL_UNIFORM_BLOCK_NAME_LENGTH', | 
|  | 1338       'GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS', | 
|  | 1339       'GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES', | 
|  | 1340       'GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER', | 
|  | 1341       'GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER', | 
|  | 1342     ], | 
|  | 1343     'invalid': [ | 
|  | 1344       'GL_NEAREST', | 
|  | 1345     ], | 
|  | 1346   }, | 
| 1316   'VertexAttribType': { | 1347   'VertexAttribType': { | 
| 1317     'type': 'GLenum', | 1348     'type': 'GLenum', | 
| 1318     'valid': [ | 1349     'valid': [ | 
| 1319       'GL_BYTE', | 1350       'GL_BYTE', | 
| 1320       'GL_UNSIGNED_BYTE', | 1351       'GL_UNSIGNED_BYTE', | 
| 1321       'GL_SHORT', | 1352       'GL_SHORT', | 
| 1322       'GL_UNSIGNED_SHORT', | 1353       'GL_UNSIGNED_SHORT', | 
| 1323     #  'GL_FIXED',  // This is not available on Desktop GL. | 1354     #  'GL_FIXED',  // This is not available on Desktop GL. | 
| 1324       'GL_FLOAT', | 1355       'GL_FLOAT', | 
| 1325     ], | 1356     ], | 
| (...skipping 701 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2027     'data_transfer_methods': ['shm'], | 2058     'data_transfer_methods': ['shm'], | 
| 2028     'cmd_args': | 2059     'cmd_args': | 
| 2029         'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' | 2060         'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' | 
| 2030         'void* result', | 2061         'void* result', | 
| 2031     'result': [ | 2062     'result': [ | 
| 2032       'int32_t success', | 2063       'int32_t success', | 
| 2033       'int32_t size', | 2064       'int32_t size', | 
| 2034       'uint32_t type', | 2065       'uint32_t type', | 
| 2035     ], | 2066     ], | 
| 2036   }, | 2067   }, | 
|  | 2068   'GetActiveUniformBlockiv': { | 
|  | 2069     'type': 'Custom', | 
|  | 2070     'data_transfer_methods': ['shm'], | 
|  | 2071     'result': ['SizedResult<GLint>'], | 
|  | 2072     'unsafe': True, | 
|  | 2073   }, | 
| 2037   'GetActiveUniformBlockName': { | 2074   'GetActiveUniformBlockName': { | 
| 2038     'type': 'Custom', | 2075     'type': 'Custom', | 
| 2039     'data_transfer_methods': ['shm'], | 2076     'data_transfer_methods': ['shm'], | 
| 2040     'cmd_args': | 2077     'cmd_args': | 
| 2041         'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' | 2078         'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' | 
| 2042         'void* result', | 2079         'void* result', | 
| 2043     'result': ['int32_t'], | 2080     'result': ['int32_t'], | 
| 2044     'unsafe': True, | 2081     'unsafe': True, | 
| 2045   }, | 2082   }, | 
|  | 2083   'GetActiveUniformsiv': { | 
|  | 2084     'type': 'Custom', | 
|  | 2085     'data_transfer_methods': ['shm'], | 
|  | 2086     'cmd_args': | 
|  | 2087         'GLidProgram program, uint32_t indices_bucket_id, GLenum pname, ' | 
|  | 2088         'GLint* params', | 
|  | 2089     'result': ['SizedResult<GLint>'], | 
|  | 2090     'unsafe': True, | 
|  | 2091   }, | 
| 2046   'GetAttachedShaders': { | 2092   'GetAttachedShaders': { | 
| 2047     'type': 'Custom', | 2093     'type': 'Custom', | 
| 2048     'data_transfer_methods': ['shm'], | 2094     'data_transfer_methods': ['shm'], | 
| 2049     'cmd_args': 'GLidProgram program, void* result, uint32_t result_size', | 2095     'cmd_args': 'GLidProgram program, void* result, uint32_t result_size', | 
| 2050     'result': ['SizedResult<GLuint>'], | 2096     'result': ['SizedResult<GLuint>'], | 
| 2051   }, | 2097   }, | 
| 2052   'GetAttribLocation': { | 2098   'GetAttribLocation': { | 
| 2053     'type': 'Custom', | 2099     'type': 'Custom', | 
| 2054     'data_transfer_methods': ['shm'], | 2100     'data_transfer_methods': ['shm'], | 
| 2055     'cmd_args': | 2101     'cmd_args': | 
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2227     'type': 'Custom', | 2273     'type': 'Custom', | 
| 2228     'expectation': False, | 2274     'expectation': False, | 
| 2229     'impl_func': False, | 2275     'impl_func': False, | 
| 2230     'extension': True, | 2276     'extension': True, | 
| 2231     'chromium': True, | 2277     'chromium': True, | 
| 2232     'client_test': False, | 2278     'client_test': False, | 
| 2233     'cmd_args': 'GLidProgram program, uint32_t bucket_id', | 2279     'cmd_args': 'GLidProgram program, uint32_t bucket_id', | 
| 2234     'result': ['uint32_t'], | 2280     'result': ['uint32_t'], | 
| 2235     'unsafe': True, | 2281     'unsafe': True, | 
| 2236   }, | 2282   }, | 
|  | 2283   'GetUniformsES3CHROMIUM': { | 
|  | 2284     'type': 'Custom', | 
|  | 2285     'expectation': False, | 
|  | 2286     'impl_func': False, | 
|  | 2287     'extension': True, | 
|  | 2288     'chromium': True, | 
|  | 2289     'client_test': False, | 
|  | 2290     'cmd_args': 'GLidProgram program, uint32_t bucket_id', | 
|  | 2291     'result': ['uint32_t'], | 
|  | 2292     'unsafe': True, | 
|  | 2293   }, | 
|  | 2294   'GetTransformFeedbackVarying': { | 
|  | 2295     'type': 'Custom', | 
|  | 2296     'data_transfer_methods': ['shm'], | 
|  | 2297     'cmd_args': | 
|  | 2298         'GLidProgram program, GLuint index, uint32_t name_bucket_id, ' | 
|  | 2299         'void* result', | 
|  | 2300     'result': [ | 
|  | 2301       'int32_t success', | 
|  | 2302       'int32_t size', | 
|  | 2303       'uint32_t type', | 
|  | 2304     ], | 
|  | 2305     'unsafe': True, | 
|  | 2306   }, | 
|  | 2307   'GetTransformFeedbackVaryingsCHROMIUM': { | 
|  | 2308     'type': 'Custom', | 
|  | 2309     'expectation': False, | 
|  | 2310     'impl_func': False, | 
|  | 2311     'extension': True, | 
|  | 2312     'chromium': True, | 
|  | 2313     'client_test': False, | 
|  | 2314     'cmd_args': 'GLidProgram program, uint32_t bucket_id', | 
|  | 2315     'result': ['uint32_t'], | 
|  | 2316     'unsafe': True, | 
|  | 2317   }, | 
| 2237   'GetUniformfv': { | 2318   'GetUniformfv': { | 
| 2238     'type': 'Custom', | 2319     'type': 'Custom', | 
| 2239     'data_transfer_methods': ['shm'], | 2320     'data_transfer_methods': ['shm'], | 
| 2240     'result': ['SizedResult<GLfloat>'], | 2321     'result': ['SizedResult<GLfloat>'], | 
| 2241   }, | 2322   }, | 
| 2242   'GetUniformiv': { | 2323   'GetUniformiv': { | 
| 2243     'type': 'Custom', | 2324     'type': 'Custom', | 
| 2244     'data_transfer_methods': ['shm'], | 2325     'data_transfer_methods': ['shm'], | 
| 2245     'result': ['SizedResult<GLint>'], | 2326     'result': ['SizedResult<GLint>'], | 
| 2246   }, | 2327   }, | 
|  | 2328   'GetUniformIndices': { | 
|  | 2329     'type': 'Custom', | 
|  | 2330     'data_transfer_methods': ['shm'], | 
|  | 2331     'result': ['SizedResult<GLuint>'], | 
|  | 2332     'cmd_args': 'GLidProgram program, uint32_t names_bucket_id, ' | 
|  | 2333                 'GLuint* indices', | 
|  | 2334     'unsafe': True, | 
|  | 2335   }, | 
| 2247   'GetUniformLocation': { | 2336   'GetUniformLocation': { | 
| 2248     'type': 'Custom', | 2337     'type': 'Custom', | 
| 2249     'data_transfer_methods': ['shm'], | 2338     'data_transfer_methods': ['shm'], | 
| 2250     'cmd_args': | 2339     'cmd_args': | 
| 2251         'GLidProgram program, uint32_t name_bucket_id, GLint* location', | 2340         'GLidProgram program, uint32_t name_bucket_id, GLint* location', | 
| 2252     'result': ['GLint'], | 2341     'result': ['GLint'], | 
| 2253     'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformL
       ocation.xml | 2342     'error_return': -1, # http://www.opengl.org/sdk/docs/man/xhtml/glGetUniformL
       ocation.xml | 
| 2254   }, | 2343   }, | 
| 2255   'GetVertexAttribfv': { | 2344   'GetVertexAttribfv': { | 
| 2256     'type': 'GETn', | 2345     'type': 'GETn', | 
| (...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2728   'UniformMatrix4x2fv': { | 2817   'UniformMatrix4x2fv': { | 
| 2729     'type': 'PUTn', | 2818     'type': 'PUTn', | 
| 2730     'count': 8, | 2819     'count': 8, | 
| 2731     'unsafe': True, | 2820     'unsafe': True, | 
| 2732   }, | 2821   }, | 
| 2733   'UniformMatrix4x3fv': { | 2822   'UniformMatrix4x3fv': { | 
| 2734     'type': 'PUTn', | 2823     'type': 'PUTn', | 
| 2735     'count': 12, | 2824     'count': 12, | 
| 2736     'unsafe': True, | 2825     'unsafe': True, | 
| 2737   }, | 2826   }, | 
|  | 2827   'UniformBlockBinding': { | 
|  | 2828     'type': 'Custom', | 
|  | 2829     'impl_func': False, | 
|  | 2830     'unsafe': True, | 
|  | 2831   }, | 
| 2738   'UnmapBufferCHROMIUM': { | 2832   'UnmapBufferCHROMIUM': { | 
| 2739     'gen_cmd': False, | 2833     'gen_cmd': False, | 
| 2740     'extension': True, | 2834     'extension': True, | 
| 2741     'chromium': True, | 2835     'chromium': True, | 
| 2742     'client_test': False, | 2836     'client_test': False, | 
| 2743   }, | 2837   }, | 
| 2744   'UnmapBufferSubDataCHROMIUM': { | 2838   'UnmapBufferSubDataCHROMIUM': { | 
| 2745     'gen_cmd': False, | 2839     'gen_cmd': False, | 
| 2746     'extension': True, | 2840     'extension': True, | 
| 2747     'chromium': True, | 2841     'chromium': True, | 
| (...skipping 3725 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6473       } | 6567       } | 
| 6474     } | 6568     } | 
| 6475   }); | 6569   }); | 
| 6476 """ | 6570 """ | 
| 6477     file.Write(log_code_block % { | 6571     file.Write(log_code_block % { | 
| 6478           'data': data_arg.name, | 6572           'data': data_arg.name, | 
| 6479           'length': length_arg.name if not length_arg == None else '' | 6573           'length': length_arg.name if not length_arg == None else '' | 
| 6480       }) | 6574       }) | 
| 6481     for arg in func.GetOriginalArgs(): | 6575     for arg in func.GetOriginalArgs(): | 
| 6482       arg.WriteClientSideValidationCode(file, func) | 6576       arg.WriteClientSideValidationCode(file, func) | 
| 6483     size_code_block = """  // Compute the total size. | 6577 | 
| 6484   base::CheckedNumeric<size_t> total_size = count; |  | 
| 6485   total_size += 1; |  | 
| 6486   total_size *= sizeof(GLint); |  | 
| 6487   if (!total_size.IsValid()) { |  | 
| 6488     SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |  | 
| 6489     return; |  | 
| 6490   } |  | 
| 6491   size_t header_size = total_size.ValueOrDefault(0); |  | 
| 6492   std::vector<GLint> header(count + 1); |  | 
| 6493   header[0] = static_cast<GLint>(count); |  | 
| 6494   for (GLsizei ii = 0; ii < count; ++ii) { |  | 
| 6495     GLint len = 0; |  | 
| 6496     if (%(data)s[ii]) {""" |  | 
| 6497     if length_arg == None: |  | 
| 6498       size_code_block += """ |  | 
| 6499       len = static_cast<GLint>(strlen(%(data)s[ii]));""" |  | 
| 6500     else: |  | 
| 6501       size_code_block += """ |  | 
| 6502       len = (%(length)s && %(length)s[ii] >= 0) ? |  | 
| 6503           %(length)s[ii] : base::checked_cast<GLint>(strlen(%(data)s[ii]));""" |  | 
| 6504     size_code_block += """ |  | 
| 6505     } |  | 
| 6506     total_size += len; |  | 
| 6507     total_size += 1;  // NULL at the end of each char array. |  | 
| 6508     if (!total_size.IsValid()) { |  | 
| 6509       SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |  | 
| 6510       return; |  | 
| 6511     } |  | 
| 6512     header[ii + 1] = len; |  | 
| 6513 } |  | 
| 6514 """ |  | 
| 6515     file.Write(size_code_block % { |  | 
| 6516         'data': data_arg.name, |  | 
| 6517         'length': length_arg.name if not length_arg == None else '', |  | 
| 6518         'func_name': func.name, |  | 
| 6519       }) |  | 
| 6520     data_code_block = """  // Pack data into a bucket on the service. |  | 
| 6521   helper_->SetBucketSize(kResultBucketId, total_size.ValueOrDefault(0)); |  | 
| 6522   size_t offset = 0; |  | 
| 6523   for (GLsizei ii = 0; ii <= count; ++ii) { |  | 
| 6524     const char* src = (ii == 0) ? reinterpret_cast<const char*>(&header[0]) : |  | 
| 6525         %(data)s[ii - 1]; |  | 
| 6526     base::CheckedNumeric<size_t> checked_size = (ii == 0) ? header_size : |  | 
| 6527         static_cast<size_t>(header[ii]); |  | 
| 6528     if (ii > 0) { |  | 
| 6529       checked_size += 1;  // NULL in the end. |  | 
| 6530     } |  | 
| 6531     if (!checked_size.IsValid()) { |  | 
| 6532       SetGLError(GL_INVALID_VALUE, "gl%(func_name)s", "overflow"); |  | 
| 6533       return; |  | 
| 6534     } |  | 
| 6535     size_t size = checked_size.ValueOrDefault(0); |  | 
| 6536     while (size) { |  | 
| 6537       ScopedTransferBufferPtr buffer(size, helper_, transfer_buffer_); |  | 
| 6538       if (!buffer.valid() || buffer.size() == 0) { |  | 
| 6539         SetGLError(GL_OUT_OF_MEMORY, "gl%(func_name)s", "too large"); |  | 
| 6540         return; |  | 
| 6541       } |  | 
| 6542       size_t copy_size = buffer.size(); |  | 
| 6543       if (ii > 0 && buffer.size() == size) |  | 
| 6544         --copy_size; |  | 
| 6545       if (copy_size) |  | 
| 6546         memcpy(buffer.address(), src, copy_size); |  | 
| 6547       if (copy_size < buffer.size()) { |  | 
| 6548         // Append NULL in the end. |  | 
| 6549         DCHECK(copy_size + 1 == buffer.size()); |  | 
| 6550         char* str = reinterpret_cast<char*>(buffer.address()); |  | 
| 6551         str[copy_size] = 0; |  | 
| 6552       } |  | 
| 6553       helper_->SetBucketData(kResultBucketId, offset, buffer.size(), |  | 
| 6554                              buffer.shm_id(), buffer.offset()); |  | 
| 6555       offset += buffer.size(); |  | 
| 6556       src += buffer.size(); |  | 
| 6557       size -= buffer.size(); |  | 
| 6558     } |  | 
| 6559   } |  | 
| 6560   DCHECK_EQ(total_size.ValueOrDefault(0), offset); |  | 
| 6561 """ |  | 
| 6562     file.Write(data_code_block % { |  | 
| 6563         'data': data_arg.name, |  | 
| 6564         'length': length_arg.name if not length_arg == None else '', |  | 
| 6565         'func_name': func.name, |  | 
| 6566       }) |  | 
| 6567     bucket_args = [] | 6578     bucket_args = [] | 
| 6568     for arg in func.GetOriginalArgs(): | 6579     for arg in func.GetOriginalArgs(): | 
| 6569       if arg.name == 'count' or arg == self.__GetLengthArg(func): | 6580       if arg.name == 'count' or arg == self.__GetLengthArg(func): | 
| 6570         continue | 6581         continue | 
| 6571       if arg == self.__GetDataArg(func): | 6582       if arg == self.__GetDataArg(func): | 
| 6572         bucket_args.append('kResultBucketId') | 6583         bucket_args.append('kResultBucketId') | 
| 6573       else: | 6584       else: | 
| 6574         bucket_args.append(arg.name) | 6585         bucket_args.append(arg.name) | 
| 6575     file.Write("  helper_->%sBucket(%s);\n" % | 6586     code_block = """ | 
| 6576                (func.name, ", ".join(bucket_args))) | 6587   if (!PackStringsToBucket(count, %(data)s, %(length)s, "gl%(func_name)s")) { | 
| 6577     file.Write("  helper_->SetBucketSize(kResultBucketId, 0);"); | 6588     return; | 
| 6578     file.Write("  CheckGLError();\n") | 6589   } | 
| 6579     file.Write("}\n") | 6590   helper_->%(func_name)sBucket(%(bucket_args)s); | 
| 6580     file.Write("\n") | 6591   helper_->SetBucketSize(kResultBucketId, 0); | 
|  | 6592   CheckGLError(); | 
|  | 6593 } | 
|  | 6594 | 
|  | 6595 """ | 
|  | 6596     file.Write(code_block % { | 
|  | 6597         'data': data_arg.name, | 
|  | 6598         'length': length_arg.name if not length_arg == None else 'NULL', | 
|  | 6599         'func_name': func.name, | 
|  | 6600         'bucket_args': ', '.join(bucket_args), | 
|  | 6601       }) | 
| 6581 | 6602 | 
| 6582   def WriteGLES2ImplementationUnitTest(self, func, file): | 6603   def WriteGLES2ImplementationUnitTest(self, func, file): | 
| 6583     """Overrriden from TypeHandler.""" | 6604     """Overrriden from TypeHandler.""" | 
| 6584     code = """ | 6605     code = """ | 
| 6585 TEST_F(GLES2ImplementationTest, %(name)s) { | 6606 TEST_F(GLES2ImplementationTest, %(name)s) { | 
| 6586   const uint32 kBucketId = GLES2Implementation::kResultBucketId; | 6607   const uint32 kBucketId = GLES2Implementation::kResultBucketId; | 
| 6587   const char* kString1 = "happy"; | 6608   const char* kString1 = "happy"; | 
| 6588   const char* kString2 = "ending"; | 6609   const char* kString2 = "ending"; | 
| 6589   const size_t kString1Size = ::strlen(kString1) + 1; | 6610   const size_t kString1Size = ::strlen(kString1) + 1; | 
| 6590   const size_t kString2Size = ::strlen(kString2) + 1; | 6611   const size_t kString2Size = ::strlen(kString2) + 1; | 
| (...skipping 1411 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8002 class InputStringArrayBucketArgument(Argument): | 8023 class InputStringArrayBucketArgument(Argument): | 
| 8003   """A string array input argument where the strings are passed in a bucket.""" | 8024   """A string array input argument where the strings are passed in a bucket.""" | 
| 8004 | 8025 | 
| 8005   def __init__(self, name, type): | 8026   def __init__(self, name, type): | 
| 8006     Argument.__init__(self, name + "_bucket_id", "uint32_t") | 8027     Argument.__init__(self, name + "_bucket_id", "uint32_t") | 
| 8007     self._original_name = name | 8028     self._original_name = name | 
| 8008 | 8029 | 
| 8009   def WriteGetCode(self, file): | 8030   def WriteGetCode(self, file): | 
| 8010     """Overridden from Argument.""" | 8031     """Overridden from Argument.""" | 
| 8011     code = """ | 8032     code = """ | 
| 8012   const size_t kMinBucketSize = sizeof(GLint); |  | 
| 8013   // Each string has at least |length| in the header and a NUL character. |  | 
| 8014   const size_t kMinStringSize = sizeof(GLint) + 1; |  | 
| 8015   Bucket* bucket = GetBucket(c.%(name)s); | 8033   Bucket* bucket = GetBucket(c.%(name)s); | 
| 8016   if (!bucket) { | 8034   if (!bucket) { | 
| 8017     return error::kInvalidArguments; | 8035     return error::kInvalidArguments; | 
| 8018   } | 8036   } | 
| 8019   const size_t bucket_size = bucket->size(); | 8037   GLsizei count = 0; | 
| 8020   if (bucket_size < kMinBucketSize) { | 8038   std::vector<char*> strs; | 
|  | 8039   std::vector<GLint> len; | 
|  | 8040   if (!bucket->GetAsStrings(&count, &strs, &len)) { | 
| 8021     return error::kInvalidArguments; | 8041     return error::kInvalidArguments; | 
| 8022   } | 8042   } | 
| 8023   const char* bucket_data = bucket->GetDataAs<const char*>(0, bucket_size); | 8043   const char** %(original_name)s = | 
| 8024   const GLint* header = reinterpret_cast<const GLint*>(bucket_data); | 8044       strs.size() > 0 ? const_cast<const char**>(&strs[0]) : NULL; | 
| 8025   GLsizei count = static_cast<GLsizei>(header[0]); | 8045   const GLint* length = | 
| 8026   if (count < 0) { | 8046       len.size() > 0 ? const_cast<const GLint*>(&len[0]) : NULL; | 
| 8027     return error::kInvalidArguments; | 8047   (void)length; | 
| 8028   } |  | 
| 8029   const size_t max_count = (bucket_size - kMinBucketSize) / kMinStringSize; |  | 
| 8030   if (max_count < static_cast<size_t>(count)) { |  | 
| 8031     return error::kInvalidArguments; |  | 
| 8032   } |  | 
| 8033   const GLint* length = header + 1; |  | 
| 8034   scoped_ptr<const char*[]> strs; |  | 
| 8035   if (count > 0) |  | 
| 8036     strs.reset(new const char*[count]); |  | 
| 8037   const char** %(original_name)s = strs.get(); |  | 
| 8038   base::CheckedNumeric<size_t> total_size = sizeof(GLint); |  | 
| 8039   total_size *= count + 1;  // Header size. |  | 
| 8040   if (!total_size.IsValid()) |  | 
| 8041     return error::kInvalidArguments; |  | 
| 8042   for (GLsizei ii = 0; ii < count; ++ii) { |  | 
| 8043     %(original_name)s[ii] = bucket_data + total_size.ValueOrDefault(0); |  | 
| 8044     total_size += length[ii]; |  | 
| 8045     total_size += 1;  // NUL char at the end of each char array. |  | 
| 8046     if (!total_size.IsValid() || total_size.ValueOrDefault(0) > bucket_size || |  | 
| 8047         %(original_name)s[ii][length[ii]] != 0) { |  | 
| 8048       return error::kInvalidArguments; |  | 
| 8049     } |  | 
| 8050   } |  | 
| 8051   if (total_size.ValueOrDefault(0) != bucket_size) { |  | 
| 8052     return error::kInvalidArguments; |  | 
| 8053   } |  | 
| 8054 """ | 8048 """ | 
| 8055     file.Write(code % { | 8049     file.Write(code % { | 
| 8056         'name': self.name, | 8050         'name': self.name, | 
| 8057         'original_name': self._original_name, | 8051         'original_name': self._original_name, | 
| 8058       }) | 8052       }) | 
| 8059 | 8053 | 
| 8060   def GetValidArg(self, func): | 8054   def GetValidArg(self, func): | 
| 8061     return "kNameBucketId" | 8055     return "kNameBucketId" | 
| 8062 | 8056 | 
| 8063   def GetValidGLArg(self, func): | 8057   def GetValidGLArg(self, func): | 
| (...skipping 2074 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 10138   Format(gen.generated_cpp_filenames) | 10132   Format(gen.generated_cpp_filenames) | 
| 10139 | 10133 | 
| 10140   if gen.errors > 0: | 10134   if gen.errors > 0: | 
| 10141     print "%d errors" % gen.errors | 10135     print "%d errors" % gen.errors | 
| 10142     return 1 | 10136     return 1 | 
| 10143   return 0 | 10137   return 0 | 
| 10144 | 10138 | 
| 10145 | 10139 | 
| 10146 if __name__ == '__main__': | 10140 if __name__ == '__main__': | 
| 10147   sys.exit(main(sys.argv[1:])) | 10141   sys.exit(main(sys.argv[1:])) | 
| OLD | NEW | 
|---|