use of com.github.anba.es6draft.compiler.assembler.Code.MethodCode in project es6draft by anba.
the class CodeGenerator method scriptBody.
private void scriptBody(Script node) {
MethodCode method = newMethod(node, ScriptName.Code);
ScriptCodeVisitor body = new ScriptCodeVisitor(method, node);
body.lineInfo(node);
body.begin();
body.loadUndefined();
body.storeCompletionValue(ValType.Undefined);
body.enterScope(node);
Completion result = statements(node.getStatements(), body);
body.exitScope();
if (!result.isAbrupt()) {
body.loadCompletionValue();
body._return();
}
body.end();
}
use of com.github.anba.es6draft.compiler.assembler.Code.MethodCode in project es6draft by anba.
the class CodeGenerator method conciseFunctionBody.
private boolean conciseFunctionBody(ArrowFunction node) {
MethodCode method = newMethod(node, FunctionName.Code);
FunctionCodeVisitor body = new FunctionCodeVisitor(method, node);
body.lineInfo(node);
body.begin();
// call expression in concise function body is always in tail-call position
Expression expression = node.getExpression();
body.enterTailCallPosition(expression);
body.enterFunction(node);
expressionBoxed(expression, body);
body.exitFunction();
body._return();
body.end();
return body.hasTailCalls();
}
use of com.github.anba.es6draft.compiler.assembler.Code.MethodCode in project es6draft by anba.
the class CodeGenerator method compile.
MethodName compile(BlockStatement node, BlockDeclarationInstantiationGenerator generator) {
if (!isCompiled(node)) {
MethodCode method = newMethod(node);
BlockDeclInitVisitor body = new BlockDeclInitVisitor(method);
body.lineInfo(node);
body.begin();
Variable<ExecutionContext> cx = body.getExecutionContext();
Variable<LexicalEnvironment<DeclarativeEnvironmentRecord>> env = body.getLexicalEnvironment();
generator.generateMethod(node, cx, env, body);
body._return();
body.end();
}
return methodDesc(node);
}
use of com.github.anba.es6draft.compiler.assembler.Code.MethodCode in project es6draft by anba.
the class CodeGenerator method functionBody.
private boolean functionBody(FunctionNode node) {
MethodCode method = newMethod(node, FunctionName.Code);
FunctionCodeVisitor body = new FunctionCodeVisitor(method, node);
body.lineInfo(node);
body.begin();
body.enterFunction(node);
Completion result = statements(node.getStatements(), body);
body.exitFunction();
if (!result.isAbrupt()) {
// fall-thru, return undefined from function
body.loadUndefined();
body._return();
}
body.end();
return body.hasTailCalls();
}
use of com.github.anba.es6draft.compiler.assembler.Code.MethodCode in project es6draft by anba.
the class CodeGenerator method generatorComprehensionBody.
private boolean generatorComprehensionBody(GeneratorComprehension node) {
MethodCode method = newMethod(node, FunctionName.Code);
GeneratorCodeVisitor body = new GeneratorCodeVisitor(method, node);
body.lineInfo(node);
body.begin();
GeneratorState generatorState = body.generatorPrologue();
body.enterFunction(node);
EvaluateGeneratorComprehension(this, node, body);
body.exitFunction();
body.loadUndefined();
body._return();
body.generatorEpilogue(generatorState);
body.end();
return body.hasTailCalls();
}
Aggregations