use of org.develnext.jphp.core.tokenizer.token.Token in project jphp by jphp-compiler.
the class ExpressionStmtCompiler method writePushCall.
Memory writePushCall(CallExprToken function, boolean returnValue, boolean writeOpcode, PushCallStatistic statistic) {
Token name = function.getName();
if (name instanceof NameToken) {
String realName = ((NameToken) name).getName();
CompileFunction compileFunction = compiler.getScope().findCompileFunction(realName);
// try find system function, like max, sin, cos, etc.
if (compileFunction == null && name instanceof FulledNameToken && compiler.getEnvironment().fetchFunction(realName) == null && compiler.findFunction(realName) == null) {
String tryName = ((FulledNameToken) name).getLastName().getName();
compileFunction = compiler.getScope().findCompileFunction(tryName);
}
if (compileFunction != null) {
return writePushCompileFunction(function, compileFunction, returnValue, writeOpcode, statistic);
} else {
if (!writeOpcode)
return null;
method.entity.setImmutable(false);
int index = method.clazz.getAndIncCallFuncCount();
writePushEnv();
writePushTraceInfo(function);
writePushString(realName.toLowerCase());
writePushString(realName);
writePushParameters(function.getParameters());
writeGetStatic("$CALL_FUNC_CACHE", FunctionCallCache.class);
writePushConstInt(index);
writeSysStaticCall(InvokeHelper.class, "call", Memory.class, Environment.class, TraceInfo.class, String.class, String.class, Memory[].class, FunctionCallCache.class, Integer.TYPE);
if (!returnValue)
writePopAll(1);
}
} else if (name instanceof StaticAccessExprToken) {
method.entity.setImmutable(false);
if (((StaticAccessExprToken) name).isAsParent())
return writePushParentDynamicMethod(function, returnValue, writeOpcode, statistic);
else
return writePushStaticMethod(function, returnValue, writeOpcode, statistic);
} else if (name instanceof DynamicAccessExprToken) {
method.entity.setImmutable(false);
return writePushDynamicMethod(function, returnValue, writeOpcode, statistic);
} else {
if (!writeOpcode)
return null;
method.entity.setImmutable(false);
writeLineNumber(function);
writePush((ValueExprToken) function.getName(), true, false);
writePopBoxing();
writePushParameters(function.getParameters());
writePushEnv();
writePushTraceInfo(function);
writeSysStaticCall(InvokeHelper.class, "callAny", Memory.class, Memory.class, Memory[].class, Environment.class, TraceInfo.class);
if (!returnValue)
writePopAll(1);
}
return null;
}
use of org.develnext.jphp.core.tokenizer.token.Token in project jphp by jphp-compiler.
the class ConstTest method testSimple.
@Test
public void testSimple() {
List<Token> tree = getSyntaxTree("const my_CONST = 1;");
Assert.assertTrue(tree.size() == 1);
Assert.assertTrue(tree.get(0) instanceof ConstStmtToken);
ConstStmtToken constant = (ConstStmtToken) tree.get(0);
Assert.assertEquals("my_CONST", constant.items.get(0).getFulledName());
Assert.assertNull(constant.getClazz());
Assert.assertNotNull(constant.items.get(0).value);
Assert.assertTrue(constant.items.get(0).value.getTokens().size() == 1);
Assert.assertTrue(constant.items.get(0).value.getTokens().get(0) instanceof IntegerExprToken);
}
use of org.develnext.jphp.core.tokenizer.token.Token in project jphp by jphp-compiler.
the class NamespaceUseSyntaxTest method testSimple.
@Test
public void testSimple() {
List<Token> tree = getSyntaxTree("use foo\\bar;");
Assert.assertTrue(tree.size() == 1);
Assert.assertTrue(tree.get(0) instanceof NamespaceUseStmtToken);
NamespaceUseStmtToken token = (NamespaceUseStmtToken) tree.get(0);
Assert.assertNull(token.getAs());
Assert.assertNotNull(token.getName());
Assert.assertEquals("foo\\bar", token.getName().toName());
}
use of org.develnext.jphp.core.tokenizer.token.Token in project jphp by jphp-compiler.
the class ExpressionStmtCompiler method writePushArray.
public Memory writePushArray(ArrayExprToken array, boolean returnMemory, boolean writeOpcode) {
if (array.getParameters().isEmpty()) {
if (returnMemory)
return new ArrayMemory();
else if (writeOpcode)
writeSysStaticCall(ArrayMemory.class, "valueOf", Memory.class);
} else {
ArrayMemory ret = returnMemory ? new ArrayMemory() : null;
List<ExprStmtToken> parameters = array.getParameters();
if (ret == null) {
boolean map = false;
for (ExprStmtToken token : array.getParameters()) {
for (Token sub : token.getTokens()) {
if (sub instanceof KeyValueExprToken) {
map = true;
break;
}
}
if (map)
break;
}
writePushConstInt(parameters.size());
if (map) {
writeSysStaticCall(ArrayMemory.class, "createHashed", ArrayMemory.class, int.class);
} else {
writeSysStaticCall(ArrayMemory.class, "createListed", ArrayMemory.class, int.class);
}
}
for (ExprStmtToken param : parameters) {
if (ret == null)
writePushDup();
boolean variadic = param.isVariadic();
Memory result = writeExpression(param, true, true, ret == null);
if (result != null && !variadic) {
if (ret != null) {
ret.add(result);
continue;
} else {
writePushMemory(result);
}
} else {
if (!writeOpcode) {
return null;
}
ret = null;
}
if ((result == null || variadic) && returnMemory) {
return writePushArray(array, false, writeOpcode);
}
writePopBoxing();
writePopImmutable();
if (variadic) {
writePushEnv();
writePushTraceInfo(param);
writeSysDynamicCall(ArrayMemory.class, "addVariadic", void.class, Memory.class, Environment.class, TraceInfo.class);
} else {
writeSysDynamicCall(ArrayMemory.class, "add", ReferenceMemory.class, Memory.class);
writePopAll(1);
}
}
if (ret != null)
return ret;
}
setStackPeekAsImmutable();
return null;
}
use of org.develnext.jphp.core.tokenizer.token.Token in project jphp by jphp-compiler.
the class ExpressionStmtCompiler method writeUnaryOperator.
Memory writeUnaryOperator(OperatorExprToken operator, boolean returnValue, boolean writeOpcode) {
if (stackEmpty(true))
unexpectedToken(operator);
StackItem o = stackPop();
ValueExprToken L = o.getToken();
Memory mem = tryWritePush(o, false, false, true);
StackItem.Type type = tryGetType(o);
if (mem != null) {
Memory result = CompilerUtils.calcUnary(getCompiler().getEnvironment(), operator.toTraceInfo(getCompiler().getContext()), mem, operator);
if (operator instanceof ValueIfElseToken) {
ValueIfElseToken valueIfElseToken = (ValueIfElseToken) operator;
ExprStmtToken ret = valueIfElseToken.getValue();
if (mem.toBoolean()) {
if (ret == null)
result = mem;
else
result = writeExpression(ret, true, true, false);
} else {
result = writeExpression(valueIfElseToken.getAlternative(), true, true, false);
}
} else if (operator instanceof ArrayGetExprToken && !(operator instanceof ArrayGetRefExprToken)) {
// TODO: check!!!
/*Memory array = mem;
ArrayGetExprToken arrayGet = (ArrayGetExprToken)operator;
for(ExprStmtToken expr : arrayGet.getParameters()){
Memory key = writeExpression(expr, true, true, false);
if (key == null)
break;
result = array = array.valueOfIndex(key).toImmutable();
}*/
}
if (result != null) {
stackPush(result);
setStackPeekAsImmutable();
return result;
}
}
if (!writeOpcode)
return null;
writeLineNumber(operator);
String name = operator.getCode();
Class operatorResult = operator.getResultClass();
LocalVariable variable = null;
if (L instanceof VariableExprToken) {
variable = method.getLocalVariable(((VariableExprToken) L).getName());
if (operator instanceof ArrayPushExprToken || operator instanceof ArrayGetRefExprToken)
variable.setValue(null);
}
if (operator instanceof IncExprToken || operator instanceof DecExprToken) {
if (variable == null || variable.isReference()) {
if (operator.getAssociation() == Association.LEFT && returnValue) {
writePush(o);
if (stackPeek().type.isConstant())
unexpectedToken(operator);
writePushDup();
writePopImmutable();
code.add(new InsnNode(SWAP));
writePushDup();
} else {
writePush(o);
if (stackPeek().type.isConstant())
unexpectedToken(operator);
writePushDup();
}
writeSysDynamicCall(Memory.class, name, operatorResult);
writeSysDynamicCall(Memory.class, "assign", Memory.class, operatorResult);
if (!returnValue || operator.getAssociation() == Association.LEFT) {
writePopAll(1);
}
} else {
writePush(o);
if (stackPeek().type.isConstant())
unexpectedToken(operator);
if (operator.getAssociation() == Association.LEFT && returnValue) {
writeVarLoad(variable);
}
writeSysDynamicCall(Memory.class, name, operatorResult);
// TODO for constant values
variable.setValue(null);
if (operator.getAssociation() == Association.RIGHT)
writeVarStore(variable, returnValue);
else {
writeVarStore(variable, false);
}
}
} else if (operator instanceof AmpersandRefToken) {
writePush(o, false, false);
setStackPeekAsImmutable();
Token token = o.getToken();
if (token instanceof VariableExprToken) {
LocalVariable local = method.getLocalVariable(((VariableExprToken) token).getName());
local.setValue(null);
}
} else if (operator instanceof SilentToken) {
writePushEnv();
writeSysDynamicCall(Environment.class, "__pushSilent", void.class);
writePush(o);
writePushEnv();
writeSysDynamicCall(Environment.class, "__popSilent", void.class);
} else if (operator instanceof ValueIfElseToken) {
writePush(o);
ValueIfElseToken valueIfElseToken = (ValueIfElseToken) operator;
LabelNode end = new LabelNode();
LabelNode elseL = new LabelNode();
if (valueIfElseToken.getValue() == null) {
StackItem.Type dup = stackPeek().type;
writePushDup();
if (operator instanceof ValueNullCoalesceIfElseToken) {
writePopBoxing();
writeSysDynamicCall(Memory.class, "isNotNull", Boolean.TYPE);
} else {
writePopBoolean();
}
code.add(new JumpInsnNode(Opcodes.IFEQ, elseL));
stackPop();
writePopBoxing();
stackPop();
code.add(new JumpInsnNode(Opcodes.GOTO, end));
code.add(elseL);
// remove duplicate of condition value , IMPORTANT!!!
makePop(dup);
writeExpression(valueIfElseToken.getAlternative(), true, false);
writePopBoxing();
code.add(end);
} else {
writePopBoolean();
code.add(new JumpInsnNode(Opcodes.IFEQ, elseL));
stackPop();
writeExpression(valueIfElseToken.getValue(), true, false);
writePopBoxing();
stackPop();
// goto end
code.add(new JumpInsnNode(Opcodes.GOTO, end));
// else
code.add(elseL);
writeExpression(valueIfElseToken.getAlternative(), true, false);
writePopBoxing();
code.add(end);
}
setStackPeekAsImmutable(false);
} else if (operator instanceof ArrayGetExprToken) {
stackPush(o);
writeArrayGet((ArrayGetExprToken) operator, returnValue);
} else if (operator instanceof CallOperatorToken) {
writePush(o);
writePopBoxing();
CallOperatorToken call = (CallOperatorToken) operator;
writePushParameters(call.getParameters());
writePushEnv();
writePushTraceInfo(operator);
writeSysStaticCall(InvokeHelper.class, "callAny", Memory.class, Memory.class, Memory[].class, Environment.class, TraceInfo.class);
if (!returnValue)
writePopAll(1);
} else {
writePush(o);
writePopBoxing();
if (operator.isEnvironmentNeeded() && operator.isTraceNeeded()) {
writePushEnv();
writePushTraceInfo(operator);
writeSysDynamicCall(Memory.class, name, operatorResult, Environment.class, TraceInfo.class);
} else if (operator.isEnvironmentNeeded()) {
writePushEnv();
writeSysDynamicCall(Memory.class, name, operatorResult, Environment.class);
} else if (operator.isTraceNeeded()) {
writePushTraceInfo(operator);
writeSysDynamicCall(Memory.class, name, operatorResult, TraceInfo.class);
} else
writeSysDynamicCall(Memory.class, name, operatorResult);
if (!returnValue) {
writePopAll(1);
}
}
return null;
}
Aggregations