/** * Copyright (c) 2012-2016 André Bargull * Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms. * * <https://github.com/anba/es6draft> */ package com.github.anba.es6draft.compiler; import com.github.anba.es6draft.ast.BindingIdentifier; import com.github.anba.es6draft.ast.IdentifierReference; import com.github.anba.es6draft.ast.Node; import com.github.anba.es6draft.compiler.DefaultCodeGenerator.ValType; import com.github.anba.es6draft.compiler.assembler.MethodName; import com.github.anba.es6draft.compiler.assembler.Type; /** * 8.3.1 ResolveBinding ( name, [env] ) */ final class IdentifierResolution { private static final class Methods { // class: ExecutionContext static final MethodName ExecutionContext_resolveBinding = MethodName.findVirtual( Types.ExecutionContext, "resolveBinding", Type.methodType(Types.Reference, Types.String, Type.BOOLEAN_TYPE)); static final MethodName ExecutionContext_resolveBindingValue = MethodName.findVirtual( Types.ExecutionContext, "resolveBindingValue", Type.methodType(Types.Object, Types.String, Type.BOOLEAN_TYPE)); } private IdentifierResolution() { } static ValType resolve(IdentifierReference node, CodeVisitor mv) { return resolve(node, node.getName(), mv); } static ValType resolve(BindingIdentifier node, CodeVisitor mv) { return resolve(node, node.getName().getIdentifier(), mv); } static ValType resolveValue(IdentifierReference node, CodeVisitor mv) { return resolveValue(node, node.getName(), mv); } private static ValType resolve(Node node, String identifierName, CodeVisitor mv) { mv.loadExecutionContext(); mv.aconst(identifierName); mv.iconst(mv.isStrict()); mv.lineInfo(node); mv.invoke(Methods.ExecutionContext_resolveBinding); return ValType.Reference; } private static ValType resolveValue(Node node, String identifierName, CodeVisitor mv) { mv.loadExecutionContext(); mv.aconst(identifierName); mv.iconst(mv.isStrict()); mv.lineInfo(node); mv.invoke(Methods.ExecutionContext_resolveBindingValue); return ValType.Any; } }