private byte[] GenerateCode(string encodedSource)
{
bool hasScript = (scriptOrFnNodes[0].GetType() == Token.SCRIPT);
bool hasFunctions = (scriptOrFnNodes.Length > 1 || !hasScript);
string sourceFile = null;
if (compilerEnv.IsGenerateDebugInfo())
{
sourceFile = scriptOrFnNodes[0].GetSourceName();
}
ClassFileWriter cfw = new ClassFileWriter(mainClassName, SUPER_CLASS_NAME, sourceFile);
cfw.AddField(ID_FIELD_NAME, "I", ClassFileWriter.ACC_PRIVATE);
if (hasFunctions)
{
GenerateFunctionConstructor(cfw);
}
if (hasScript)
{
cfw.AddInterface("org/mozilla/javascript/Script");
GenerateScriptCtor(cfw);
GenerateMain(cfw);
GenerateExecute(cfw);
}
GenerateCallMethod(cfw);
GenerateResumeGenerator(cfw);
GenerateNativeFunctionOverrides(cfw, encodedSource);
int count = scriptOrFnNodes.Length;
for (int i = 0; i != count; ++i)
{
ScriptNode n = scriptOrFnNodes[i];
BodyCodegen bodygen = new BodyCodegen();
bodygen.cfw = cfw;
bodygen.codegen = this;
bodygen.compilerEnv = compilerEnv;
bodygen.scriptOrFn = n;
bodygen.scriptOrFnIndex = i;
try
{
bodygen.GenerateBodyCode();
}
catch (ClassFileWriter.ClassFileFormatException e)
{
throw ReportClassFileFormatException(n, e.Message);
}
if (n.GetType() == Token.FUNCTION)
{
OptFunctionNode ofn = OptFunctionNode.Get(n);
GenerateFunctionInit(cfw, ofn);
if (ofn.IsTargetOfDirectCall())
{
EmitDirectConstructor(cfw, ofn);
}
}
}
EmitRegExpInit(cfw);
EmitConstantDudeInitializers(cfw);
return cfw.ToByteArray();
}