/** * Resolves an item that will be assigned to an array offset * * @param CompiledExpression $resolvedExpr * @param CompilationContext $compilationContext */ protected function _getResolvedArrayItem(CompiledExpression $resolvedExpr, CompilationContext $compilationContext) { $codePrinter = $compilationContext->codePrinter; switch ($resolvedExpr->getType()) { case 'null': $symbolVariable = new GlobalConstant('ZEPHIR_GLOBAL(global_null)'); break; case 'int': case 'uint': case 'long': $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal()); $codePrinter->output('ZVAL_LONG(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getCode() . ');'); break; case 'char': $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal()); $codePrinter->output('ZVAL_LONG(' . $symbolVariable->getName() . ', \'' . $resolvedExpr->getCode() . '\');'); break; case 'double': $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal()); $codePrinter->output('ZVAL_DOUBLE(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getCode() . ');'); break; case 'bool': if ($resolvedExpr->getBooleanCode() == '1') { $symbolVariable = new GlobalConstant('ZEPHIR_GLOBAL(global_true)'); } else { if ($resolvedExpr->getBooleanCode() == '0') { $symbolVariable = new GlobalConstant('ZEPHIR_GLOBAL(global_false)'); } else { $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal()); $codePrinter->output('ZVAL_BOOL(' . $symbolVariable->getName() . ', ' . $resolvedExpr->getBooleanCode() . ');'); } } break; case 'string': $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal()); $codePrinter->output('ZVAL_STRING(' . $symbolVariable->getName() . ', "' . $resolvedExpr->getCode() . '", 1);'); break; case 'array': $symbolVariable = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $resolvedExpr->getOriginal()); break; case 'variable': $variableExpr = $compilationContext->symbolTable->getVariableForRead($resolvedExpr->getCode(), $compilationContext, $resolvedExpr->getOriginal()); switch ($variableExpr->getType()) { case 'int': case 'uint': case 'long': case 'ulong': $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal()); $codePrinter->output('ZVAL_LONG(' . $symbolVariable->getName() . ', ' . $variableExpr->getName() . ');'); break; case 'double': $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal()); $codePrinter->output('ZVAL_DOUBLE(' . $symbolVariable->getName() . ', ' . $variableExpr->getName() . ');'); break; case 'bool': $symbolVariable = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext, $resolvedExpr->getOriginal()); $codePrinter->output('ZVAL_BOOL(' . $symbolVariable->getName() . ', ' . $variableExpr->getName() . ');'); break; case 'variable': case 'string': case 'array': $symbolVariable = $variableExpr; break; default: throw new CompilerException("Variable: " . $variableExpr->getType() . " cannot be assigned to array offset", $resolvedExpr->getOriginal()); } break; default: throw new CompilerException("Expression: " . $resolvedExpr->getType() . " cannot be assigned to array offset", $resolvedExpr->getOriginal()); } return $symbolVariable; }
/** * Resolves an item to be added in an array * * @param CompiledExpression $exprCompiled * @param CompilationContext $compilationContext * @return Variable */ public function getArrayValue($exprCompiled, CompilationContext $compilationContext) { $codePrinter = $compilationContext->codePrinter; switch ($exprCompiled->getType()) { case 'int': case 'uint': case 'long': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $codePrinter->output('ZVAL_LONG(' . $tempVar->getName() . ', ' . $exprCompiled->getCode() . ');'); return $tempVar; case 'char': case 'uchar': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $codePrinter->output('ZVAL_LONG(' . $tempVar->getName() . ', \'' . $exprCompiled->getCode() . '\');'); return $tempVar; case 'double': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $codePrinter->output('ZVAL_DOUBLE(' . $tempVar->getName() . ', ' . $exprCompiled->getCode() . ');'); return $tempVar; case 'bool': if ($exprCompiled->getCode() == 'true') { return new GlobalConstant('ZEPHIR_GLOBAL(global_true)'); } else { if ($exprCompiled->getCode() == 'false') { return new GlobalConstant('ZEPHIR_GLOBAL(global_false)'); } else { throw new Exception('?'); } } break; case 'null': return new GlobalConstant('ZEPHIR_GLOBAL(global_null)'); case 'string': case 'ulong': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $codePrinter->output('ZVAL_STRING(' . $tempVar->getName() . ', "' . $exprCompiled->getCode() . '", 1);'); return $tempVar; case 'array': return $compilationContext->symbolTable->getVariableForRead($exprCompiled->getCode(), $compilationContext, $exprCompiled->getOriginal()); case 'variable': $itemVariable = $compilationContext->symbolTable->getVariableForRead($exprCompiled->getCode(), $compilationContext, $exprCompiled->getOriginal()); switch ($itemVariable->getType()) { case 'int': case 'uint': case 'long': case 'ulong': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $codePrinter->output('ZVAL_LONG(' . $tempVar->getName() . ', ' . $itemVariable->getName() . ');'); return $tempVar; case 'double': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $codePrinter->output('ZVAL_DOUBLE(' . $tempVar->getName() . ', ' . $itemVariable->getName() . ');'); return $tempVar; case 'bool': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $codePrinter->output('ZVAL_BOOL(' . $tempVar->getName() . ', ' . $itemVariable->getName() . ');'); return $tempVar; case 'string': case 'variable': case 'array': return $itemVariable; default: throw new CompilerException("Unknown " . $itemVariable->getType(), $itemVariable); } break; default: throw new CompilerException("Unknown", $exprCompiled); } }
/** * Resolves an item to be added in an array * * @param CompiledExpression $exprCompiled * @param CompilationContext $compilationContext * @return Variable */ public function getArrayValue(CompiledExpression $exprCompiled, CompilationContext $compilationContext) { $codePrinter = $compilationContext->codePrinter; switch ($exprCompiled->getType()) { case 'int': case 'uint': case 'long': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $compilationContext->backend->assignLong($tempVar, $exprCompiled->getCode(), $compilationContext); return $tempVar; case 'char': case 'uchar': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $compilationContext->backend->assignLong($tempVar, '\'' . $exprCompiled->getCode() . '\'', $compilationContext); return $tempVar; case 'double': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $compilationContext->backend->assignDouble($tempVar, $exprCompiled->getCode(), $compilationContext); return $tempVar; case 'bool': if ($exprCompiled->getCode() == 'true') { return new GlobalConstant('ZEPHIR_GLOBAL(global_true)'); } if ($exprCompiled->getCode() == 'false') { return new GlobalConstant('ZEPHIR_GLOBAL(global_false)'); } $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $compilationContext->backend->assignBool($tempVar, $exprCompiled->getCode(), $compilationContext); return $tempVar; case 'null': return new GlobalConstant('ZEPHIR_GLOBAL(global_null)'); case 'string': case 'ulong': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $compilationContext->backend->assignString($tempVar, $exprCompiled->getCode(), $compilationContext); return $tempVar; case 'array': return $compilationContext->symbolTable->getVariableForRead($exprCompiled->getCode(), $compilationContext, $exprCompiled->getOriginal()); case 'variable': $itemVariable = $compilationContext->symbolTable->getVariableForRead($exprCompiled->getCode(), $compilationContext, $exprCompiled->getOriginal()); switch ($itemVariable->getType()) { case 'int': case 'uint': case 'long': case 'ulong': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $compilationContext->backend->assignLong($tempVar, $itemVariable, $compilationContext); return $tempVar; case 'double': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $compilationContext->backend->assignDouble($tempVar, $itemVariable, $compilationContext); return $tempVar; case 'bool': $tempVar = $compilationContext->symbolTable->getTempVariableForWrite('variable', $compilationContext); $compilationContext->backend->assignBool($tempVar, $itemVariable, $compilationContext); return $tempVar; case 'string': case 'variable': case 'array': return $itemVariable; default: throw new CompilerException("Unknown " . $itemVariable->getType(), $itemVariable); } break; default: throw new CompilerException("Unknown", $exprCompiled); } }